https OpenSSL 阿里云 Nginx 免费证书 技术 OpenSSL 生成证书和Nginx的https配置与优化 2017-10-19 16:56 2814 更新于 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