短信能屏蔽吗-cyberlink powerdvd
![https怎么申请](/uploads/image/0025.jpg)
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怎么申请
发布评论