前言
请参考:
【HTTPS】自签CA证书 && nginx配置https服务
抄录如下:
OpenSSL具体安装及使用此文中不再累赘,请参考网上相关文档。
首先生成X509格式的CA自签名证书
$openssl req -new -x509 -keyout myca.key -out myca.crt –days 90
生成SSL客户端的私钥(key文件)及csr文件
$openssl genrsa -des3 -out SSL.key 1024 –days 90
$openssl req -new -key SSL.key -out SSL.csr –days 90
用生成的CA的证书为刚才生成的SSL.csr文件签名
$openssl ca -in SSL.csr -out SSL.crt -cert myca.crt -keyfile myca.key –days 90
生成p12格式证书
$openssl pkcs12 -export -inkey SSL.key -in SSL.crt -out SSL.pfx
完成以上操作后在当前目录下会有六个文件,分别是myca.crt,myca.key,SSL.crt,SSL.csr,SSL.key,SSL.pfx。其中CA的公钥myca.crt 和用户的私钥 SSL.pfx是我们需要的文件。
如果在这步出现错误信息:
[weigw@TEST bin]$ openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
Using configuration from /usr/share/ssl/openssl.cnf I am unable to access the ./demoCA/newcerts directory ./demoCA/newcerts: No such file or directory
[weigw@TEST bin]$
自己手动创建一个CA目录结构:
[weigw@TEST bin]$ mkdir ./demoCA
[weigw@TEST bin]$ mkdir demoCA/newcerts
创建个空文件:
[weigw@TEST bin]$ vi demoCA/index.txt
创建文件:
[weigw@TEST bin]$ vi demoCA/serial
向文件中写入01
并且第二行空一行
openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
基本概念
KEY 通常指私钥。
CSR 是Certificate Signing Request的缩写,即证书签名请求,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。
CRT 即 certificate的缩写,即证书。
X.509 是一种证书格式.对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。
X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:
PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.
Apache和*NIX服务器偏向于使用这种编码格式.
DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.
Java和Windows服务器偏向于使用这种编码格式
OpenSSL 相当于SSL的一个实现,如果把SSL规范看成OO中的接口,那么OpenSSL则认为是接口的实现。接口规范本身是安全没问题的,但是具体实现可能会有不完善的地方,比如之前的"心脏出血"漏洞,就是OpenSSL中的一个bug.
key 私钥,csr 公钥,crt 证书
过程
首先,我们要先新建一个 文件目录:
mkdir -p /etc/pki/CA/
cd /etc/pki/CA/
为什么偏要这个目录??额,我也不知道不过,
这个目录想必是openssl默认位置了。放在一起方便点吧。
注意,1024位已经不安全了啊,现在要2048了,请参考:
所以我们认真输入:
openssl genrsa -des3 -out ca.key 2048
顺便填写密码:
然后,生成crt–公钥。
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
顺便填写一些信息:
请参考:
openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
common name应该要填你的域名,下面这位兄弟也遇到:
解决自建ca认证后浏览器警告
好了,我们本地测试,先记着,
已经成功生成了私钥key以及CA公钥即CA根证书,然后,
生成HTTPS证书私钥
openssl genrsa -des3 -out server.pem 2048
生成签名请求
openssl req -new -key server.pem -out server.csr
注意,最后会问你
A challenge password ?
意思是;
好了,自行设置以后:
成功生成 csr—公钥,也是证书签名请求文件。
用CA进行签名
-- openssl ca -policy policy_anything -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out ca.crt
这里犯了一个很严重的问题!-out xxx.crt 是目标文件,不要让他覆盖 原本的 ca.crt!!!
openssl ca -policy policy_anything -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out wangwangwang.crt
然后,问题1出现:
ca: ./demoCA/newcerts is not a directory
./demoCA/newcerts: No such file or directory
解决方案:
于是:
mkdir -p demoCA/newcerts
touch demoCA/index.txt
touch demoCA/serial
echo '01'>demoCA/serial
然后继续执行:
注意!!!
这里犯了一个很严重的问题!-out xxx.crt 是目标文件,不要让他覆盖 原本的 ca.crt!!!
于是勤奋的lz重新做了一次,然后终于得到我们的重要目标文件了:
nginx配置https
好了,刚才生成的crt以及pem分别是:
/etc/pki/CA/wangwangwang.crt
/etc/pki/CA/server.pem
然后我们主要修改这些内容:
server {
listen 80;
listen 443 ssl;
#server_name zou.lu;
#root /var/www/html;
#ssl on; //这行必须要注释掉
ssl_certificate /etc/pki/CA/wangwangwang.crt;
ssl_certificate_key /etc/pki/CA/server.pem;
}
修改为:
重启:
nginx -s reload
额。。竟然要输入密码,太不方便了!!!
好,我们输入密码试试。
访问主页:
http形式:
https方式:
无法访问。。
不可能,我们一步一步按照网上教程来做,于是重启一下看看:
好,问题出现了:
SSL_CTX_use_PrivateKey_file("/etc/pki/CA/server.pem") failed (SSL: error:2807106B:UI routines:UI_proces
h好了,我们改改:
openssl rsa -in ca.key -out no-pwd-ca.key
然后,更名:
mv ca.key ca-with-pwd.key
mv no-pwd-ca.key ca.key
重启:
额。。不行,所以,还是正正经经再来一个crt证书算了。
证书重制
强烈推荐:
如何为nginx配置https(免费证书)
嗯,这个可以一步到位了。。
下面是抄录:
如何为nginx配置https(免费证书)【抄录部分】
一、我们需要什么证书
之前写过一篇《tomcat https配置方法(免费证书)》的简书(想看的可以去我的主页里面看下,这两篇之间还是有许多相关联的知识的~),里面有提到过常用证书的分类,其中nginx使用的就是PEM格式的证书,我们将其拆分开就是需要两个文件,一个是.key文件,一个是.crt文件.
二、怎样获取免费证书
这里提供两个方法:
第一种:如果你是windows用户,且有.keystore格式的证书
那么你可以使用JKS2PFX转换工具,将你的keystore证书转换为PEM证书,操作方法为:cd到工具目录,然后运行命令:
$ JKS2PFX <KeyStore文件> <KeyStore密码> <Alias别名> <导出文件名>
第二种:如果你是Linux或者OSX系统
生成秘钥key,运行:
$ openssl genrsa -des3 -out server.key 2048
会有两次要求输入密码,输入同一个即可
输入密码
然后你就获得了一个server.key文件.
以后使用此文件(通过openssl提供的命令或API)可能经常回要求输入密码,如果想去除输入密码的步骤可以使用以下命令:
$ openssl rsa -in server.key -out server.key
创建服务器证书的申请文件server.csr,运行:
openssl req -new -key server.key -out server.csr
image
其中Country Name填CN,Common Name填主机名也可以不填,如果不填浏览器会认为不安全.(例如你以后的url为https://abcd/xxxx…这里就可以填abcd),其他的都可以不填.
创建CA证书:
openssl req -new -x509 -key server.key -out ca.crt -days 3650
此时,你可以得到一个ca.crt的证书,这个证书用来给自己的证书签名.
创建自当前日期起有效期为期十年的服务器证书server.crt:
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
ls你的文件夹,可以看到一共生成了5个文件:
ca.crt ca.srl server.crt server.csr server.key
其中,server.crt和server.key就是你的nginx需要的证书文件.
三、如何配置nginx
打开你的nginx配置文件,搜索443找到https的配置,去掉这段代码的注释.或者直接复制我下面的这段配置:
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /root/Lee/keys/server.crt;#配置证书位置
ssl_certificate_key /root/Lee/keys/server.key;#配置秘钥位置
#ssl_client_certificate ca.crt;#双向认证
#ssl_verify_client on; #双向认证
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
将ssl_certificate改为server.crt的路径,将ssl_certificate_key改为server.key的路径.
nginx -s reload 重载配置
至此,nginx的https就可以使用了,默认443端口.
作者:夜_雪
链接:https://www.jianshu.com/p/9523d888cf77
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。