牢骚
距上一篇文章曾经时隔两年还要多了,我不禁感概时光如白驹过隙,而本人仍是少年,不论是身材心理上还是技术上。然而,人生不仅仅是工作一方面,我技术上仍比不上平均水平,不过几年来播种的也是不少。
引言
我明确对称加密、非对称加密、公钥、私钥等各种概念。然而我该怎么操作呢?我接触了 openssl
。其实,我基本不懂openssl
底层逻辑是啥,我只要求查阅材料后会用就行了。不要在我导入了 ca 证书后,浏览器还展现“不平安”这个页面。
应用
本人表演 CA 机构
自签名证书的问题在于服务器发给访问者的电脑或者浏览器的证书(公钥),访问者不意识,所以显示不平安界面。通常,服务器和访问者通过世界上权威的 CA 机构(第三方)来互相意识。而当初,服务器要本人做 CA 机构,而后通知访问者:“这是我。”
1. 生成 ca.key(名字应该是没有关系的)。这个是私钥。
openssl genrsa -out ca.key 4096
解释:
-out
示意输入到这个文件4096
示意加密位数 / 复杂度,1024 的倍数
2. 生成 ca.csr(证书申请文件)。中间环节。
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=SH/L=SH/O=MY/OU=FY/CN=www.batman.com/emailAddress=peace@love.com"
解释:
-new
示意新生成-key
示意基于哪个私钥生成.csr 申请文件-out
示意输入到哪个文件-
-subj
用来指定各种信息。不加这个也没问题,他就会终端屏幕上一条一条的让你输出:然而指定了 -subj,‘extra attributes’我就不会输出了
你会发现每一条和用-subj
参数是对应的
内容就写你喜爱的,包含 CN(Common Name),这个是 CA 的信息3. 生成 ca.crt 证书。这个就是咱们要发给客户端的。
openssl x509 -req -days 60 -in ca.csr -signkey ca.key -out ca.crt
解释:
-days
示意证书有效期-in
输出.csr 申请文件-signkey
基于哪个私钥-out
示意输入到哪个文件
4. 而后
把 ca.crt 发给访问者,让他双击装置在零碎证书区域,或者在浏览器中导入。
生成服务器的证书
1. 生成 server.key(名字应该是没有关系的)。这个是私钥。放在 nginx 配置里。
openssl genrsa -out server.key 2048
解释:
- 和生成 CA 的.key 文件一样嘛~
- 抉择小一点的
2048
是因为这个证书是要用来和访问者交互的,略微小一点更快、申请包更小。CA 反正生成了就放那了。
2. 生成 server.csr(证书申请文件)。中间环节。
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=SH/L=SH/O=MY/OU=FY/CN=www.batman.com/emailAddress=peace@love.com"
解释:
- 和生成 CA 的.csr 文件一样嘛~
3. 生成 server.crt(证书)。放在 nginx 配置里。
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile conf/serverCrt.conf
解释:
- 要加上这个
-CAcreateserial
-CA
你的 ca 证书是啥-CAkey
你的 ca 证书的私钥是啥-
-extfile
额定的配置文件门路。subjectAltName = @alt_names [alt_names] IP.1 = xxx.xxx.xxx.xxx IP.2 = xxx.xxx.xxx.xxx DNS.1 = www.catwoman.com DNS.2 = www.posionIvy.com
- 你能够想到,咱们之前做的步骤里,是有在.csr 生成的时候有指定过域名相干的信息(通过 CN,或者叫 Common Name)。这个例子里是
www.batman.com
。所以访问者只有通过这个域名【才】能应用咱们的证书。不然还是“不平安” - 而我须要额定的配置文件是因为,我没有域名!!须要这个参数
subjectAltName
来指定 ip。不然访问者就不认了。 - 这个参数
subjectAltName
来指定其余的域名。
- 你能够想到,咱们之前做的步骤里,是有在.csr 生成的时候有指定过域名相干的信息(通过 CN,或者叫 Common Name)。这个例子里是
4. 配置 nginx。而后 reload。
重点在ssl on;
ssl_certificate "{yourCertPath}/server.crt";
ssl_certificate_key "{yourCertPath}/server.key";
# Settings for a TLS enabled server.
#
server {listen {yourPort} ssl http2 default_server;
listen [::]:{yourPort} ssl http2 default_server;
server_name _;
ssl on;
root {yourRootPath};
ssl_certificate "{yourCertPath}/server.crt";
ssl_certificate_key "{yourCertPath}/server.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / { }
error_page 404 /404.html;
location = /40x.html { }
error_page 500 502 503 504 /50x.html;
location = /50x.html {}}
总结
实现后的证书列表像这样。ca.srl
用来寄存【被撤消的证书】,波及到服务器怎么置信访问者是访问者。
[appadmin@localhost cert]$ ls -l
总用量 36
-rw-r--r-- 1 appadmin appzone 1647 7 月 3 13:50 ca1.csr
-rw-r--r-- 1 appadmin appzone 2017 7 月 3 13:25 ca.crt
-rw-r--r-- 1 appadmin appzone 1752 7 月 3 13:24 ca.csr
-rw------- 1 appadmin appzone 3247 7 月 3 13:03 ca.key
-rw-r--r-- 1 appadmin appzone 41 7 月 3 14:21 ca.srl
drwxr-xr-x 2 appadmin appzone 62 7 月 3 14:19 conf
-rw-r--r-- 1 appadmin appzone 952 7 月 3 13:50 server1.csr
-rw-r--r-- 1 appadmin appzone 1708 7 月 3 14:21 server.crt
-rw-r--r-- 1 appadmin appzone 1058 7 月 3 13:27 server.csr
-rw------- 1 appadmin appzone 1679 7 月 3 13:16 server.key
[appadmin@localhost cert]$
咱们发现,生成 CA 的证书和生成 server 的证书基本上都是一样的。当然还有很多拓展的命令,比方在生成.key 的是后指定明码算法(rsa、des。。。)、再比方在验证证书的时候,指定必须 / 可选校验不同信息、再比方应用配置文件。
不论怎么样,当初,访问者应该能辨认这的确是服务端送过来的响应。chrome、edge、safari 都是能识别系统的根证书的,阐明访问者双击 ca.crt 装置在零碎就行了。而 firefox 貌似是不反对的,必须要导入到 firefox 本人的证书列表里。地位如下截图,请留神在【证书颁发机构里】导入。
将你的 ca.crt 通过邮件?微信?短信?发送给访问者。