Nginx+SSL搭建 HTTPS 网站
一、HTTPS是什么?
根据维基百科的解释:
超文本传输安全协议(缩写:HTTPS,英语:HypertextTransferProtocolSecure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。HTTPS不应与在RFC2660中定义的安全超文本传输协议(S-HTTP)相混。 HTTPS目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS网站已不再是大型网站的专利,所有普通的个人站长和博客均可以自己动手搭建一个安全的加密的网站。
如果一个网站没有加密,那么你的所有帐号密码都是明文传输。可想而知,如果涉及到隐私和金融问题,不加密的传输是多么可怕的一件事。
鉴于本博客的读者都是接近专业人士,我们不再多费口舌,直接进入正题吧。
二、使用OpenSSL生成SSLKey和CSR
由于只有浏览器或者系统信赖的CA才可以让所有的访问者通畅的访问你的加密网站,而不是出现证书错误的提示。所以我们跳过自签证书的步骤,直接开始签署第三方可信任的SSL证书吧。
OpenSSL在Linux、OSX等常规的系统下默认都安装了,因为一些安全问题,一般现在的第三方SSL证书签发机构都要求起码2048位的RSA加密的私钥。
同时,普通的SSL证书认证分两种形式,一种是DV(DomainValidated),还有一种是OV(OrganizationValidated),前者只需要验证域名,后者需要验证你的组织或公司,在安全性方面,肯定是后者要好。
无论你用DV还是OV生成私钥,都需要填写一些基本信息,这里我们假设如下:
域名,也称为CommonName,因为特殊的证书不一定是域名:example.com
组织或公司名字(Organization):Example,Inc.
部门(Department):可以不填写,这里我们写WebSecurity
城市(City):Beijing
省份(State/Province):Beijing
国家(Country):CN
加密强度:2048位,如果你的机器性能强劲,也可以选择4096位
按照以上信息,使用OpenSSL生成key和csr的命令如下
opensslreq-new-newkeyrsa:2048-sha256-nodes-outexample_com.csr-keyoutexample_com.key-subj"/C=CN/ST=Beijing/L=Beijing/O=ExampleInc./OU=WebSecurity/CN=example.com"
PS:如果是泛域名证书,则应该填写*.example.com
你可以在系统的任何地方运行这个命令,会自动在当前目录生成example_com.csr和example_com.key这两个文件
接下来你可以查看一下example_com.csr,得到类似这么一长串的文字
-----BEGINCERTIFICATEREQUEST----- MIICujCCAaICAQAwdTELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaWppbmcxEDAO BgNVBAcTB0JlaWppbmcxFTATBgNVBAoTDEV4YW1wbGUgSW5jLjEVMBMGA1UECxMM V2ViIFNlY3VyaXR5MRQwEgYDVQQDEwtleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAPME+nvVCdGN9VWn+vp7JkMoOdpOurYMPvclIbsI iD7mGN982Ocl22O9wCV/4tL6DpTcXfNX+eWd7CNEKT4i+JYGqllqP3/CojhkemiY SF3jwncvP6VoST/HsZeMyNB71XwYnxFCGqSyE3QjxmQ9ae38H2LIpCllfd1l7iVp AX4i2+HvGTHFzb0XnmMLzq4HyVuEIMoYwiZX8hq+kwEAhKpBdfawkOcIRkbOlFew SEjLyHY+nruXutmQx1d7lzZCxut5Sm5At9al0bf5FOaaJylTEwNEpFkP3L29GtoU qg1t9Q8WufIfK9vXqQqwg8J1muK7kksnbYcoPnNgPx36kZsCAwEAAaAAMA0GCSqG SIb3DQEBBQUAA4IBAQCHgIuhpcgrsNwDuW6731/DeVwq2x3ZRqRBuj9/M8oONQen 1QIacBifEMr+Ma+C+wIpt3bHvtXEF8cCAJAR9sQ4Svy7M0w25DwrwaWIjxcf/J8U audL/029CkAuewFCdBILTRAAeDqxsAsUyiBIGTIT+uqi+EpGG4OlyKK/MF13FxDj /oKyrSJDtp1Xr9R7iqGCs/Zl5qWmDaLN7/qxBK6vX2R/HLhOK0aKi1ZQ4cZeP7Mr 8EzjDIAko87Nb/aIsFyKrt6Ze3jOF0/vnnpw7pMvhq+folWdTVXddjd9Dpr2x1nc y5hnop4k6kVRXDjQ4OTduQq4P+SzU4hb41GIQEz4 -----ENDCERTIFICATEREQUEST-----
这个CSR文件就是你需要提交给SSL认证机构的,当你的域名或组织通过验证后,认证机构就会颁发给你一个example_com.crt
而example_com.key是需要用在Nginx配置里和example_com.crt配合使用的,需要好好保管,千万别泄露给任何第三方。
三、Nginx配置HTTPS网站以及增加安全的配置
前面已经提到,你需要提交CSR文件给第三方SSL认证机构,通过认证后,他们会颁发给你一个CRT文件,我们命名为example_com.crt
同时,为了统一,你可以把这三个文件都移动到/etc/ssl/private/目录。
然后可以修改Nginx配置文件
server{ listen80; listen[::]:80sslipv6only=on; listen443ssl; listen[::]:443sslipv6only=on; server_nameexample.com; sslon; ssl_certificate/etc/ssl/private/example_com.crt; ssl_certificate_key/etc/ssl/private/example_com.key; }
检测配置文件没问题后重新读取Nginx即可
nginx-t&&nginx-sreload
但是这么做并不安全,默认是SHA-1形式,而现在主流的方案应该都避免SHA-1,为了确保更强的安全性,我们可以采取迪菲-赫尔曼密钥交换
首先,进入/etc/ssl/certs目录并生成一个dhparam.pem
cd/etc/ssl/certs openssldhparam-outdhparam.pem2048#如果你的机器性能足够强大,可以用4096位加密
生成完毕后,在Nginx的SSL配置后面加入
ssl_prefer_server_cipherson; ssl_dhparam/etc/ssl/certs/dhparam.pem; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_ciphers"EECDH+ECDSA+AESGCMEECDH+aRSA+AESGCMEECDH+ECDSA+SHA384EECDH+ECDSA+SHA256EECDH+aRSA+SHA384EECDH+aRSA+SHA256EECDH+aRSA+RC4EECDHEDH+aRSA!aNULL!eNULL!LOW!3DES!MD5!EXP!PSK!SRP!DSS!RC4"; keepalive_timeout70; ssl_session_cacheshared:SSL:10m; ssl_session_timeout10m;
同时,如果是全站HTTPS并且不考虑HTTP的话,可以加入HSTS告诉你的浏览器本网站全站加密,并且强制用HTTPS访问
add_headerStrict-Transport-Securitymax-age=63072000; add_headerX-Frame-OptionsDENY; add_headerX-Content-Type-Optionsnosniff;
同时也可以单独开一个Nginx配置,把HTTP的访问请求都用301跳转到HTTPS
server{ listen80; listen[::]:80ipv6only=on; server_nameexample.com; return301https://example.com$request_uri; }
四、可靠的第三方SSL签发机构
众所周知,前段时间某NIC机构爆出过针对Google域名的证书签发的丑闻,所以可见选择一家靠谱的第三方SSL签发机构是多么的重要。
目前一般市面上针对中小站长和企业的SSL证书颁发机构有:
StartSSL
Comodo/子品牌PositiveSSL
GlobalSign/子品牌AlphaSSL
GeoTrust/子品牌RapidSSL
其中PostivieSSL、AlphaSSL、RapidSSL等都是子品牌,一般都是三级四级证书,所以你会需要增加CA证书链到你的CRT文件里。
以ComodoPositiveSSL为例,需要串联CA证书,假设你的域名是example.com
那么,串联的命令是:
catexample_com.crtCOMODORSADomainValidationSecureServerCA.crtCOMODORSAAddTrustCA.crtAddTrustExternalCARoot.crt>example_com.signed.crt
在Nginx配置里使用example_com.signed.crt即可
如果是一般常见的AplhaSSL泛域名证书,他们是不会发给你CA证书链的,那么在你的CRT文件后面需要加入AlphaSSL的CA证书链
AlphaSSLIntermediateCA:https://www.alphassl.com/support/install-root-certificate.html
五、针对企业的EVSSL
EVSSL,是ExtendedValidation的简称,更注重于对企业网站的安全保护以及严格的认证。
最明显的区别就是,通常EVSSL显示都是绿色的条,比如本站的SSL证书就是EVSSL。
以上就是如何在nginx下使用SSL搭建HTTPS网站的全部内容了,希望大家能够喜欢