OpenSSL 生成证书和Nginx的https配置与优化
2017-10-19 16:56 浏览(2008 更新于 2017-10-20 17:16


越来越多的网站开始使用https,而颁发证书的这些机构就叫CA,当然我们自己也能做CA,只是浏览器不认可而已,所以那些颁发可信赖证书的机构就要收费。若是在本地测试的话,自己颁发就可以了。


服务器:CentOS 6.4(虚拟机下)


一、使用 OpenSSL 生成CA证书

一般linux都默认安装了 OpenSSL,若没有安装 ,执行

yum install openssl

配置文件在  /etc/pki/tls/openssl.cnf

主要目录:/etc/pki/CA 

以下命令都是在 这个目录下执行的

1、生成私钥

cd /etc/pki/CA/
touch index.txt serial
echo 01 > serial
openssl genrsa -out private/cakey.pem 2048

index.txt —— 用来存放已颁发证书的信息

serial —— 最后一次颁发证书的序列号

2、生成证书请求

openssl req -new -x509 -key private/cakey.pem -out cacert.pem

输入国家省份等信息

Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []:ChongQing

Locality Name (eg, city) [Default City]:ChongQing

Organization Name (eg, company) [Default Company Ltd]:jam00

Organizational Unit Name (eg, section) []:jam00

Common Name (eg, your name or your server's hostname) []:jam00.com

Email Address []:jam00@vip.qq.com


3、生成服务器端私钥( nginx.key )

openssl genrsa -out nginx.key 2048

4、生成服务器端证书签名请求文件(nginx.csr)

openssl req -new -key nginx.key -out nginx.csr

输入省份,公司等信息

Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []:ChongQing

Locality Name (eg, city) [Default City]:ChongQing

Organization Name (eg, company) [Default Company Ltd]:jam00.com

Organizational Unit Name (eg, section) []:jam00.com

Common Name (eg, your name or your server's hostname) []:jam00.com

Email Address []:jam00@vip.qq.com


Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:jam00

challenge password 不用填写,若填写,重启nginx服务器时要输入这里填写的密码


5、利用CA证书进行签名 

openssl ca -in nginx.csr -out nginx.crt

将显示如下信息,输入 y / y 就可以

Using configuration from /etc/pki/tls/openssl.cnf

Check that the request matches the signature

Signature ok

Certificate Details:

        Serial Number: 1 (0x1)

        Validity

            Not Before: Oct 19 07:20:25 2017 GMT

            Not After : Oct 19 07:20:25 2018 GMT

        Subject:

            countryName               = CN

            stateOrProvinceName       = ChongQing

            organizationName          = jam00.com

            organizationalUnitName    = jam00.com

            commonName                = jam00.com

            emailAddress              = jam00@vip.qq.com

        X509v3 extensions:

            X509v3 Basic Constraints: 

                CA:FALSE

            Netscape Comment: 

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier: 

                36:C4:70:DD:73:C7:3B:9C:41:FD:E9:A4:91:03:C0:B1:78:9E:4F:1D

            X509v3 Authority Key Identifier: 

                keyid:67:82:78:F2:E5:BA:A0:47:6D:F1:BA:FD:2B:90:5B:83:AD:EA:2B:37


Certificate is to be certified until Oct 19 07:20:25 2018 GMT (365 days)

Sign the certificate? [y/n]:y



1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated


二、Nginx 配置 https

nginx.conf 配置

server {
    listen 443 ssl;
    ssl on;
    ssl_certificate /etc/pki/CA/nginx.crt;
    ssl_certificate_key /etc/pki/CA/nginx.key;
    server_name tests.jam00.com;
    
    index index.html index.htm index.php;
    root  /mnt/hgfs/www/test1;
}
#访问80端口也重定向到https
server{
	listen 80;
	add_header Strict-Transport-Security max-age=86400;
	server_name tests.jam00.com;
	return 301 https://$server_name$request_uri;
}

add_header :这里的作用是当浏览器访问过 本网站的 https 页面后,再访问本站的其他 http 页面时,将不会请求服务器再来一次301 跳转,而是浏览器直接访问 https

重启Nginx,打开443 端口

-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT


chrome 访问 tests.jam00.com

提示 “您的连接不是私密连接”,因为我们自己颁发的证书是不被浏览器认可的,没办法,不是专业机构,但是访问网站也是加密连接。


三、阿里云免费CA证书申请

阿里云没有推出免费证书之前,我用的是 https://www.startssl.com/ ,但在新版的chrome浏览器中已不再信任它的免费版(据说是因为它乱颁发...),还有IOS11 中也不信任这个证书,对于全面禁用 http 的苹果APP来说,必须要一个https的接口了。


阿里云的免费证书申请很简单,https://common-buy.aliyun.com/?commodityCode=cas#/buy 购买免费型即可

购买后去控制台 https://yundun.console.aliyun.com/?p=cas#/cas/home 补全你的信息并提交申请,免费型只支持一个域名

验证方式我选择的是文件验证,所以还要下载对应的验证文件(fileauth.txt),并上传到域名根目录下/.well-known/pki-validation目录下(这个文件目录要自己创建)

上传完成后,访问一下这个文件 http://yourdomain/.well-known/pki-validation/fileauth.txt

若成功,就点击一下下面的检查配置,若提示成功,就OK了,等一会查看状态为已签发就行了(我等了差不多五分钟)

点击下载证书,按照阿里云的提示配置即可,基本上可以按照第二步配置就行了,这里贴一个nginx的配置示例

server {
    listen 443;
    server_name localhost;
    ssl on;
    root html;
    index index.html index.htm;
    ssl_certificate   cert/214299590960949.pem;
    ssl_certificate_key  cert/214299590960949.key;
    ssl_session_timeout 30m;
    ssl_session_cache shared:SSL:10m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        root html;
        index index.html index.htm;
    }
}

ssl_protocols:启动特定的加密协议 TLSv1 TLSv1.1 TLSv1.2,防止使用不安全的加密协议,比如 SSLv3 就存在漏洞

ssl_ciphers:指定加密套件,防止使用不安全的加密算法,

ssl_prefer_server_ciphers:优先使用服务端的加密套件,若不指定,可能会使用浏览器的加密套件,而每个浏览器的加密套件可能不同

缓存链接状态

ssl_session_cache:设置ssl/tls会话缓存的类型和大小,10M差不多了 

ssl_session_timeout:调高一下session时间 30m,默认为 5m


贴一下阿里云的帮助文档 https://help.aliyun.com/knowledge_detail/48014.html



评论(2)
发布评论
回复X
聊天室(0