现在越来越多的站点使用了https加密,这里结合密钥的创建到nginx的https配置分别进行下介绍。TLS或传输层安全( transport layer security),它的前身是SSL(安全套接字层secure sockets layer),是Web协议用来包裹在一个受保护,加密封装正常通道。采用这种技术,服务器和客户端之间可以安全地进行交互,而不用担心消息将被拦截和读取。证书系统帮助用户在核实它们与连接站点的身份。

一、创建RSA SSL认证

 1# mkdir -p /etc/nginx/ssl
 2# openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
 3Generating a 2048 bit RSA private key
 4.+++
 5......................+++
 6writing new private key to '/etc/nginx/ssl/nginx.key'
 7-----
 8You are about to be asked to enter information that will be incorporated
 9into your certificate request.
10What you are about to enter is what is called a Distinguished Name or a DN.
11There are quite a few fields but you can leave some blank
12For some fields there will be a default value,
13If you enter '.', the field will be left blank.
14-----
15Country Name (2 letter code) [XX]:CN
16State or Province Name (full name) []:zhejiang
17Locality Name (eg, city) [Default City]:hangzhou
18Organization Name (eg, company) [Default Company Ltd]:mycompany
19Organizational Unit Name (eg, section) []:361way
20Common Name (eg, your name or your server's hostname) []:361way.com
21Email Address []:[email protected]

这里创建了有效期100年,加密强度为RSA 2048的SSL密钥key和X509证书文件。具体的参数说明如下:

req: 配置参数-x509指定使用 X.509证书签名请求管理(certificate signing request (CSR)).”X.509″ 是一个公钥代表that SSL and TLS adheres to for its key and certificate management.
-nodes: 告诉OpenSSL生产证书时忽略密码环节.(因为我们需要Nginx自动读取这个文件,而不是以用户交互的形式)。
-days 36500: 证书有效期,100年
-newkey rsa:2048: 同时产生一个新证书和一个新的SSL key(加密强度为RSA 2048)
-keyout: SSL输出文件名
-out:证书生成文件名
它会问一些问题。需要注意的是在common name中填入网站域名,如wiki.361way.com即可生成该站点的证书,同时也可以使用泛域名如*.361way.com来生成所有二级域名可用的网站证书。

二、配置nginx SSL认证

首先配置HTTP请求重定

 1server {
 2        listen       80;
 3        server_name  www.yourdomain.com;
 4        rewrite ^ https://$http_host$request_uri? permanent;    # force redirect http to https
 5    #return 301 https://$http_host$request_uri;
 6    }
 7server {
 8        listen 443 ssl;
 9        ssl_certificate /etc/nginx/ssl/nginx.crt;
10        ssl_certificate_key /etc/nginx/ssl/nginx.key;
11    keepalive_timeout   70;
12        server_name www.yourdomain.com;
13    #禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击
14    server_tokens off;
15    #如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问
16    #add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
17        # ......
18        fastcgi_param   HTTPS               on;
19        fastcgi_param   HTTP_SCHEME         https;
20    access_log      /var/log/nginx/wiki.361way.com.access.log;
21        error_log       /var/log/nginx/wiki.361way.com.error.log;
22    }

如果想同时启用HTTP和HTTPS:

1server {
2    listen              80;
3    listen              443 ssl;
4    server_name         www.example.com;
5    ssl_certificate     www.example.com.crt;
6    ssl_certificate_key www.example.com.key;
7    ...
8}

重启nginx后生效。常见的证书格式如下:

1.crt:自签名的证书
2.csr:证书的请求(用于向证书颁发机构申请crt证书时使用,nginx配置时不会用到)
3.key:SSL Key (分为不带口令和带口令版本)

我们自签名证书配置nginx需要的是.crt证书,和不带口令的SSL Key的.key文件。如果想要配置https又不想花钱,可以使用Let’s Encrypt家的免费服务,不过https证书需要三个月更新一次。

三、其他

除了上面用到的RSA算法,还会有des3、PKCS12格式的Keystore,生成方法如下:

1openssl genrsa -des3 -out private-rsa.key 1024

命令执行过程中的提示信息Enter pass phrase 的含义是输入用来保护私钥文件的密码(最好不要超过6位)。

1openssl pkcs12 -export -name test-alias -in public-rsa.cer -inkey private-rsa.key -out user-rsa.pfx

另外还有格式转换和信息查看相关的命令如下:

 1从pfx格式的证书提取出密钥和证书
 2set OPENSSL_CONF=openssl.cnf
 3openssl pkcs12 -in my.pfx -nodes -out server.pem
 4openssl rsa -in server.pem -out server.key 
 5openssl x509 -in server.pem -out server.crt
 6PEM格式的证书与DER格式的证书的转换
 7openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER 
 8openssl x509 -in ca.cer -inform DER -out ca.pem -outform  PEM
 9打印出证书的内容: 
10openssl x509 -in cert.pem -noout -text 
11打印出证书的系列号 
12openssl x509 -in cert.pem -noout -serial 
13打印出证书的拥有者名字 
14openssl x509 -in cert.pem -noout -subject 
15以RFC2253规定的格式打印出证书的拥有者名字 
16openssl x509 -in cert.pem -noout -subject -nameopt RFC2253 
17在支持UTF8的终端一行过打印出证书的拥有者名字 
18openssl x509 -in cert.pem -noout -subject -nameopt oneline -nameopt -escmsb 
19打印出证书的MD5特征参数 
20openssl x509 -in cert.pem -noout -fingerprint 
21打印出证书的SHA特征参数 
22openssl x509 -sha1 -in cert.pem -noout -fingerprint 
23把PEM格式的证书转化成DER格式 
24openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER 
25把一个证书转化成CSR 
26openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem 
27给一个CSR进行处理,颁发字签名证书,增加CA扩展项 
28openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca -signkey key.pem -out cacert.pem 
29给一个CSR签名,增加用户证书扩展项 
30openssl x509 -req -in req.pem -extfile openssl.cnf -extensions v3_usr -CA cacert.pem -CAkey key.pem -CAcreateserial