短信能屏蔽吗-cyberlink powerdvd

https怎么申请
2023年4月6日发(作者: net framework 4 0是什么)

https证书的验证过程与⽣成⽅法

1.简洁的解释:

1.服务器⽤RSA⽣成公钥和私钥

2.把公钥放在证书⾥发送给客户端,私钥⾃⼰保存

3.客户端⾸先向⼀个权威的服务器检查证书的合法性,如果证书合法,客户端产⽣⼀段随机数,这个随机数就作为通信的密钥,我们称之为

对称密钥,⽤公钥加密这段随机数,然后发送到服务器

4.服务器⽤密钥解密获取对称密钥,然后,双⽅就已对称密钥进⾏加密解密通信了

PS:⾮对称的RSA加密性能是⾮常低的,原因在于寻找⼤素数、⼤数计算、数据分割需要耗费很多的CPU周期,所以⼀般的HTTPS连接只

在第⼀次握⼿时使⽤⾮对称加密,通过握⼿交换对称加密密钥,在之后的通信⾛对称加密。

2.详细的:

1.浏览器将⾃⼰⽀持的⼀套加密规则发送给⽹站。

2.⽹站从中选出⼀组加密算法与HASH算法,并将⾃⼰的⾝份信息以证书的形式发回给浏览器。证书⾥⾯包含了⽹站地址,加密公钥,以及

证书的颁发机构等信息。

3.浏览器获得⽹站证书之后浏览器要做以下⼯作:

a)验证证书的合法性(颁发证书的机构是否合法,证书中包含的⽹站地址是否与正在访问的地址⼀致等),如果证书受信任,则浏览器栏⾥

⾯会显⽰⼀个⼩锁头,否则会给出证书不受信的提⽰。

b)如果证书受信任,或者是⽤户接受了不受信的证书,浏览器会⽣成⼀串随机数的密码,并⽤证书中提供的公钥加密。

c)使⽤约定好的HASH算法计算握⼿消息,并使⽤⽣成的随机数对消息进⾏加密,最后将之前⽣成的所有信息发送给⽹站。

4.⽹站接收浏览器发来的数据之后要做以下的操作:

a)使⽤⾃⼰的私钥将信息解密取出密码,使⽤密码解密浏览器发来的握⼿消息,并验证HASH是否与浏览器发来的⼀致。

b)使⽤密码加密⼀段握⼿消息,发送给浏览器。

5.浏览器解密并计算握⼿消息的HASH,如果与服务端发来的HASH⼀致,此时握⼿过程结束,之后所有的通信数据将由之前浏览器⽣成的

随机密码并利⽤对称加密算法进⾏加密。

3.实现:

⽣成密钥、证书

第⼀步,为服务器端和客户端准备公钥、私钥

[java]

1.#⽣成服务器端私钥

1024

3.#⽣成服务器端公钥

5.

6.

7.#⽣成客户端私钥

1024

9.#⽣成客户端公钥

第⼆步,⽣成CA证书

[java]

1.#⽣成CA私钥

1024

3.#X.509CertificateSigningRequest(CSR)Management.

5.#X.509CertificateDataManagement.

在执⾏第⼆步时会出现:

[java]

1.➜

abouttobeaskedtoenterinformationthatwillbeincorporated

urcertificaterequest.

uareabouttoenteriswhatiscalledaDistinguishedNameoraDN.

requiteafewfieldsbutyoucanleavesomeblank

efieldstherewillbeadefaultvalue,

nter'.',thefieldwillbeleftblank.

8.-----

yName(2lettercode)[AU]:CN

rProvinceName(fullname)[Some-State]:Zhejiang

tyName(eg,city)[]:Hangzhou

zationName(eg,company)[InternetWidgitsPtyLtd]:MyCA

zationalUnitName(eg,section)[]:

Name(FQDNorYOURname)[]:localhost

ddress[]:

注意,这⾥的OrganizationName(eg,company)[InternetWidgitsPtyLtd]:后⾯⽣成客户端和服务器端证书的时候也需要填写,不要写成⼀样

的可以随意写如:MyCA,MyServer,MyClient。

然后CommonName(FQDNorYOURname)[]:这⼀项,是最后可以访问的域名,我这⾥为了⽅便测试,写成localhost,如果是为了给我

的⽹站⽣成证书,需要写成。

第三步,⽣成服务器端证书和客户端证书

[java]

1.#服务器端需要向CA机构申请签名证书,在申请签名证书之前依然是创建⾃⼰的CSR⽂件

3.#向⾃⼰的CA机构申请证书,签名过程需要CA的证书和私钥参与,最终颁发⼀个带有CA签名的证书

5.

6.#client端

8.#client端到CA签名

此时,我们的keys⽂件夹下已经有如下内容了:

[java]

1..

2.├──

3.├──

4.└──keys

5.├──

6.├──

7.├──

8.├──

9.├──

10.├──

11.├──

12.├──

13.├──

14.├──

15.├──

16.├──

17.└──

看到上⾯两个js⽂件了么,我们来跑⼏个demo。

HTTPS本地测试

服务器代码:

[java]

1.//

ps=require('https');

=require('fs');

4.

ions={

:leSync('./keys/'),

:leSync('./keys/')

8.};

9.

Server(options,function(req,res){

ead(200);

('helloworld');

13.}).listen(8000);

短短⼏⾏代码就构建了⼀个简单的https服务器,options将私钥和证书带上。然后利⽤curl测试:

[java]

1.➜httpscurlhttps://localhost:8000

:(60)SSLcertificateproblem:Invalidcertificatechain

tailshere:/docs/

4.

rformsSSLcertificateverificationbydefault,usinga"bundle"

ificateAuthority(CA)publickeys(CAcerts).Ifthedefault

fileisn'tadequate,youcanspecifyanalternatefile

he--cacertoption.

HTTPSserverusesacertificatesignedbyaCArepresentedin

dle,thecertificateverificationprobablyfailedduetoa

mwiththecertificate(itmightbeexpired,orthenamemight

chthedomainnameintheURL).

'dliketoturnoffcurl'sverificationofthecertificate,use

-k(or--insecure)option.

⼀堆提⽰,原因是没有经过CA认证,添加-k参数能够解决这个问题:

[java]

1.➜httpscurl-khttps://localhost:8000

orld%

这样的⽅式是不安全的,存在我们上⾯提到的中间⼈攻击问题。可以搞⼀个客户端带上CA证书试试:

[java]

1.//

ps=require('https');

=require('fs');

4.

ions={

me:"localhost",

:8000,

:'/',

:'GET',

:leSync('./keys/'),

:leSync('./keys/'),

:[leSync('./keys/')]

13.};

14.

=(options);

16.

=t(options,function(res){

oding('utf-8');

('data',function(d){

(d);

21.});

22.});

();

24.

('error',function(e){

(e);

27.});

先打开服务器,然后执⾏

[java]

1.➜

orld

如果你的代码没有输出

helloworld,说明证书⽣成的时候存在问题。也可以通过访问:

提⽰错误:

此服务器⽆法证明它是localhost;您计算机的操作不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。

原因是浏览器没有CA证书,只有CA证书,服务器才能够确定,这个⽤户就是真实的来⾃localhost的访问请求(⽐如不是代理过来

的)。

更多推荐

https怎么申请