HTTPS/SSL/TLS #
需要使用加密的http连接,就需要证书和私钥 私钥服务器持有,证书(公钥)分发出去 然后公钥加密对称加密的秘钥(生成的一串随机数) 最后双方通信使用对称加密。两边都持有对称加密的秘钥
https证书生成: #
1、生成RSA密钥的方法 openssl genrsa -des3 -out key.pem 2048 这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成: openssl genrsa -out key.pem 2048 建议用2048位密钥,少于此可能会不安全或很快将不安全。
2、生成一个证书请求
openssl req -new -key key.pem -out cert.csr
这个命令将会生成一个证书请求,当然,用到了前面生成的密钥key.pem文件
这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cert.pem,那才是你的数字证书。
如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
这个命令将用上面生成的密钥key.pem生成一个数字证书cert.pem
3、使用数字证书和密钥
有了key.pem和cert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器
上述是讲解的详情,如果我们要生成私钥用于测试本地https(该命令来自nodejs文档https部分):
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
-keyout key.pem -out cert.pem
然后将cert.pem(公钥),key.pem(私钥)放到index.js或nginx.conf目录即可:
const http2 = require('http2');
const fs = require('fs');
const server = http2.createSecureServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
});
server.on('error', (err) => console.error(err));
server.on('stream', (stream, headers) => {
// 流是一个双工流。
stream.respond({
'content-type': 'text/html; charset=utf-8',
':status': 200
});
stream.end('<h1>你好世界</h1>');
});
server.listen(8443);
对于nginx.conf,这里以http2为例,因为http2强制使用https:
值得一提的是http2依然可以proxy到http1.1的服务器
(因为http2解决了队头阻塞问题和二进制传输,所以只要客户端和网关间建立http2连接即可,不必内部完全是http2,nginx暂时持有http2 frame,最后组成http文本头传给服务器)
server {
listen 443 ssl http2;
server_name hostname.com;
ssl_certificate cert/cert.pem;
ssl_certificate_key cert/key.pem;
location / {
proxy_pass http://localhost:12345;
}
}
chrome不受信任的连接问题 #
根据TLS(安全传输层)原理,客户端必须有证书。
mac系统里,打开钥匙链app(keychain access),然后file->import item来导入cert.pem
导入后,双击该证书,设置信任该证书。
然后访问https://localhost即可。