1.生成双向证书(server服务端,ca客户端)
1.1.openss生成所需证书
::==================生成服务器私钥==================
openssl genrsa -out server.key -passout pass:Abc123 2048
::生成服务器证书请求文件:
openssl req -new -key server.key -passin pass:Abc123 -out server.csr -subj "/CN=*.test.com/OU=xx Club/O=dy/L=nb/ST=Beijing/C=CN"
::==================生成服务器公钥证书(单向认证时使用)==================
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650::==================生成CA私钥==================
openssl genrsa -out ca.key -passout pass:123456 2048
::生成CA公钥证书及CA私钥转换p12(浏览器需要安装此证书,否则无法访问服务)
openssl req -new -x509 -key ca.key -passin pass:123456 -out ca.crt -days 3650 -subj "/CN=*.test.com/OU=xx Club/O=dy/L=nb/ST=Beijing/C=CN"
openssl x509 -in ca.crt -out ca.pem -outform PEM
::CA私钥转换p12(浏览器需要安装此证书,否则无法访问服务)
openssl pkcs12 -export -inkey ca.key -in ca.pem -out ca.p12 -password pass:123456::==================生成服务端公钥(双向认证时使用)==================浏览器必须安装证书ca.p12
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
::生成服务端证书cer-客户端浏览器安装,不安装也可继续访问
openssl x509 -in server.crt -out server.cer -outform der
1.2.或openssl和keytool结合生成
::生成服务端私钥jks
keytool -genkeypair -alias server -keystore server.jks -storetype pkcs12 -keypass 123456 -storepass 123456 -keyalg RSA -keysize 2048 -validity 3650 -dname "CN=*.test.com, OU=xx, O=dy, L=nb,ST=Beijing,C=CN"
::keytool -export -alias server -keystore server.jks -storetype PKCS12 -storepass 123456 -rfc -file server.cer
::服务端jks私钥转换key
keytool -importkeystore -srckeystore server.jks -destkeystore server.pfx -srcstoretype PKCS12 -deststoretype PKCS12 -srcstorepass 123456 -deststorepass 123456
openssl pkcs12 -in server.pfx -nodes -out server.pem -password pass:123456
openssl rsa -in server.pem -out server.key
::服务端key创建csr
openssl req -new -key server.key -passin pass:123456 -out server.csr -subj "/CN=*.test.com/OU=xx Club/O=dy/L=nb/ST=Beijing/C=CN"::生成客户端私钥jks
keytool -genkey -v -alias ca -keystore ca.jks -storetype PKCS12 -storepass 123456 -keypass 123456 -keyalg RSA -validity 3650 -dname "CN=*.test.com,OU=cn,O=cn,L=cn,ST=Beijing,c=CN"
::生成客户端公钥
openssl pkcs12 -in ca.p12 -nodes -clcerts -out ca.crt -password pass:123456
::客户端jks私钥转换key
keytool -importkeystore -srckeystore ca.jks -destkeystore ca.pfx -srcstoretype PKCS12 -deststoretype PKCS12 -srcstorepass 123456 -deststorepass 123456
openssl pkcs12 -in ca.pfx -nodes -out ca.pem -password pass:123456
openssl rsa -in ca.pem -out ca.key
::客户端jks私钥转换p12(浏览器需要安装此证书,否则无法访问服务)
keytool -importkeystore -srckeystore ca.jks -destkeystore ca.p12 -srcstoretype jks -deststoretype PKCS12 -srcstorepass 123456 -deststorepass 123456::生成服务端公钥(必须根据ca公钥和私钥生成服务端公钥)
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
::生成服务端证书cer-客户端浏览器安装,不安装也可继续访问
openssl x509 -in server.crt -out server.cer -outform der
2.nginx配置证书
http{
……
server {# 可以不要
listen 80;
server_name localhost;# 自己的域名
rewrite ^(.*)$ https://$host$request_uri;
}
server {
listen 443 ssl;
server_name localhost;# 自己的域名
ssl_certificate /etc/nginx/keys/server.crt;#配置证书位置
ssl_certificate_key /etc/nginx/keys/server.key;#配置秘钥位置
ssl_client_certificate /etc/nginx/keys/ca.crt;#双向认证-客户端公钥
ssl_verify_client on; #双向认证-开启校验客户端
ssl_session_timeout 20m;# 配置服务器可使用的加密算法
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;# 指定服务器密码算法在优先于客户端密码算法时,使用 SSLv3 和 TLS 协议
ssl_prefer_server_ciphers on;# ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2
# ie6 只支持 SSLv2,SSLv3 但是存在安全问题, 故不支持
#ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;location / {
root /home/www.example.com/;
try_files $uri /index.html;
index index.html index.htm;
}
}……
3.浏览器访问服务
3.1.未安装证书
用chrome浏览器访问:https://127.0.0.1
3.2.安装证书ca.p12
用chrome浏览器重新访问:https://127.0.0.1
提示:选择证书
确定后,即可正常访问服务