openssl genrsa -des3 -out server.key 2048nginx
命令完成后会提示让输入密码,这个密码是经过des3(也能够采用其余加密算法)加密此密钥文件的,若是其余程序须要读取这个文件,须要输入密码算法
openssl rsa -in server.key -out server.keyshell
执行这个命令后,NGINX引用此文件不须要输入密码浏览器
openssl req -new -key server.key -out server.csr服务器
按照相关提示,填入证书相关基本信息,生成的证书经过CA签名后造成服务端本身的证书session
(Certificate Signing Request(CSR))app
openssl genrsa -des3 -out client.key 2048加密
openssl req -new -key client.key -out client.csrspa
生成的csr文件必需要通过CA签名才能造成本身的证书,咱们能够经过第三方权威认证机构进行签名,可是这个须要收费,咱们制做自签名根证书code
openssl req -new -x509 -keyout ca.key -out ca.crt
查看/etc/pki/tls/openssl.cnf文件 ,查看dir是否是指向dir= /etc/pki/CA 若是不是,请修改
touch /etc/pki/CA/{index.txt,serial}
这个是根据openssl.cnf中的配置,要求生成的文件
----------------------------------
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
-------------------------------
echo 01 > /etc/pki/CA/serial
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
至此证书签名已经所有完毕。
因为咱们生成的客户端证书是须要用在各个地方的,例如在浏览器中,在IOS和Android中,须要作相应的转换才能安装
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
openssl x509 -in client.crt -out client.cer
另外IE也能够安装.pfx格式的证书
以上步骤有些须要输入密码,密码就是咱们刚才在生成客户端和浏览器端证书时的密码,密码千万必要忘记,忘记了只能从新生成
client使用的文件有:ca.crt,client.crt,client.key,client.pfx
server使用的文件有:ca.crt, server.crt,server.key
修改nginx.conf文件
server {
listen 443 ssl; #https默认端口
root /var/www/src;
ssl on; #开启https校验
ssl_certificate ssl/server.crt; #服务端证书
ssl_certificate_key ssl/server.key; #服务端key
#ssl_client_certificate ssl/client/client.crt;#客户端证书,不须要根证书的时候可使用
ssl_client_certificate ssl/ca.crt; #客户端签发的ca证书
ssl_verify_client on; #开启对客户端的校验,这个地方是就是开启双向校验的地方
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
配置完成之后 nginx -s reload 使之生效
把相关证书导入到相应的客户端,例如在IE下,须要把根证书ca.crt安装到受信任的证书颁发机构
client.crt(client.pfx) 安装到我的证书的位置
而后打开咱们须要访问的地址https://xxx.xxx.xxx.xx能正确的打开页面即表明成功
在打开的时候,浏览器会询问,一、证书确认,二、须要凭据(是否容许此应用访问您的私钥)
以上点击确认和容许便可
(ps:接下来我会一些脚本直接把以上带颜色的命令进行生成)
经过以上命令,我写了一个shell脚本,能够快速的生成咱们须要的证书,因为不能上传附件,因此写的shell文件就不能上传上来了,贴上具体的脚本代码,还请读者复制到本身的文件中而后进行运行便可
#!/bin/sh # create self-signed server certificate: read -p "请输入证书的域 例如[www.example.com or 192.168.1.52]: " DOMAIN SUBJECT="/C=CN/ST=BJ/L=BJ/O=bky/CN=$DOMAIN" echo "建立服务器证书..." openssl genrsa -des3 -out server.key 2048 openssl rsa -in server.key -out server.key openssl req -new -subj $SUBJECT -key server.key -out server.csr echo "建立客户端证书..." openssl genrsa -des3 -out client.key 2048 openssl req -new -subj $SUBJECT -key client.key -out client.csr echo "建立根证书..." openssl req -new -x509 -keyout ca.key -out ca.crt rm -rf /etc/pki/CA/index.txt rm -rf /etc/pki/CA/serial touch /etc/pki/CA/{index.txt,serial} echo 01 > /etc/pki/CA/serial echo "用根证书对服务器证书和客户端证书签名" openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key echo "导出服务器证书和客户端证书" openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx openssl x509 -in client.crt -out client.cer openssl x509 -in server.crt -out server.cer echo "把以上生成的文件copy到nginx conf文件的ssl目录下面,若是ssl目录不存在请建立" echo "接下请配置nginx.conf操做:" echo " server { " echo " ... " echo " ssl on; " echo " ssl_certificate ssl/server.crt; " echo " ssl_certificate_key ssl/server.key; " echo " ssl_client_certificate ssl/ca.crt; " echo " ssl_verify_client on; " echo " ... " echo " } " echo "使用以下命令从新加载nginx配置" echo "nginx -s reload"
注意事项:
SUBJECT="/C=CN/ST=BJ/L=BJ/O=bky/CN=$DOMAIN"
这一部分须要改成和本身公司相符的内容,或者干脆直接更改成SUBJECT="/CN=$DOMAIN",而后在下面填写证书的时候再进行填写,若是使用了上述的SUBJECT,则在接下来填写证书信息,例如国家,城市,机构的时候必需要和这个相同,若是不相同,就会生不成server.crt证书文件。例如若是国家在SUBJECT中设置的是CN,而下面填写证书信息的时候不是CN,则执行openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key的时候会报以下错误
The countryName field needed to be the same in the
CA certificate (cn) and the request (CN)
在运行以上脚本的时候出现了一个小问题,错误信息以下:
openssl TXT_DB error number 2 failed to update database
在网上搜了一下解决方法,借鉴一下:
产生的缘由是:
This thing happens when certificates share common data. You cannot have two
certificates that look otherwise the same.
方法一:
修改demoCA下 index.txt.attr
方法二:
删除demoCA下的index.txt,并再touch下
方法三:
将 common name设置成不一样的