SSL工具
https://www.myssl.cn/tools/
https://myssl.com/certtools.html
Let’s Encrypt 单域名证书
注意:SAN证书可以把多个域名合并到一个证书里面,只要在申请时使用多个-d指定域名即可。
Let’s Encrypt 证书是免费的,3个月有效,只需要到期前续一下时间就能延长到3个月。
这里一共有3种方法。其中两种是依赖于Python环境的(letsencrypt自动脚本),需要安装很多组件且对pip有版本要求,在大天朝是无法安装的。这里介绍一种简单的方法
打开:https://certbot.eff.org
选择适合你的系统和web的选项
然后按提示运行Install栏的那些命令,其他不要运行。
安装完成后,开始获取证书
certbot certonly --webroot -w /var/html/www -d www.leolan.top,leolan.top
运行该命令后会自动获取证书,并保存到**/etc/letsencrypt/live/**下。如果是一机多站的这种情况可能是会报错的,只有第一个能获取证书,之后的其他都获取不了,这时先停止第一个网站(把ssl的相关配置从配置文件中删掉,等获取后再配置回去),再运行命令,成功之后再启动网站。
然后修改虚拟主机配置文件,在server栏加入以下部分(对应的路径改为你自己的路径):
listen 443 default ssl;
ssl_certificate /etc/letsencrypt/live/www.leolan.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.leolan.top/privkey.pem;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!ADH:!DH:!DHE";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
保存重启Nginx就应该生效了,如果网页中引用了http资源,也是没有小绿标的,可以写一句话测试用的html文件进行测试。
之后续期再次运行获取证书的命令就行了,会自动续期的,可以添加到定时任务中(增加到定时任务要注意一机多站这种情况)。
关于续期,官方提供了命令:先用这个命令测试:certbot renew --dry-run
,没有问题的话运行这个命令续期:certbot renew
。一切正常的话就可以加入到计划任务里面了。
常用命令:
certbot run #(默认)运行在当前的Web服务器中获取并安装证书
certbot certonly #获取或续订证书,但不要安装
certbot renew #续订续订所有以前获得的近期到期的证书
certbot certificates #证书显示有关Certbot的证书信息
certbot revoke --cert-path [cret.pem路径] #撤销(回收)吊销证书(提供--cert-path)
certbot delete --cert-name [证书名] #删除证书
参考:
http://www.tuicool.com/articles/iqyERrr
https://www.cnblogs.com/zcx-python/p/7089243.html
Let’s Encrypt 通配符证书
这里使用github上的一个开源项目做自动申请和续期。
注意:通配符证书和普通证书的协议不一样,不兼容;通配符只是针对二级域名,不针对主域名,即www.leolan.top和主域名leolan.top是两个证书,www可以换成其他的字符,都属于二级域名。
注意:SAN通配符证书可以把多个域名合并到一个证书里面,只要在申请时使用多个-d指定域名即可。
# 准备工作
git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au.git /opt/certbot-letencrypt
cd /opt/certbot-letencrypt
wget https://dl.eff.org/certbot-auto
chmod +x certbot-auto
chmod +x au.sh
# 登录阿里云域名所在账户,获取AK、SK,保存到脚本中
# https://help.aliyun.com/knowledge_detail/38738.html
vim au.sh
# 测试环境,域名改为自己的域名,这里使用python(详见github描述)
# 提示是否绑定IP,输入Y(应该只是防止滥用,并不会真的绑定IP)
# 过程中可以看到域名多了一个TXT记录,完成后记录被删除;提示成功
./certbot-auto certonly -d *.leolan.top --manual --preferred-challenges dns --dry-run --manual-auth-hook "/opt/certbot-letencrypt/au.sh python aly add" --manual-cleanup-hook "/opt/certbot-letencrypt/au.sh python aly clean"
# 正式申请(去除了--dry-run参数)
./certbot-auto certonly -d *.leolan.top --manual --preferred-challenges dns --manual-auth-hook "/opt/certbot-letencrypt/au.sh python aly add" --manual-cleanup-hook "/opt/certbot-letencrypt/au.sh python aly clean"
# 证书有效期是30天,添加定时任务,自动续期(这里设置每5天运行一次)
0 1 */5 * * /opt/certbot-letencrypt/certbot-auto renew --manual --preferred-challenges dns --manual-auth-hook "/opt/certbot-letencrypt/au.sh python aly add" --manual-cleanup-hook "/opt/certbot-letencrypt/au.sh python aly clean"
# 然后把证书配置好或保存
**自己构建的Dockerfile:**https://www.leolan.top/index.php/posts/222.html
**Docker运行:**https://jingsam.github.io/2018/10/12/lets-encrypt.html
参考资料:
https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
https://www.jianshu.com/p/c5c9d071e395
https://blog.csdn.net/smiles13/article/details/84523797
https://jingsam.github.io/2018/10/12/lets-encrypt.html
StartSSL证书
StartSSL证书有效期是一年的,但是到期后必须手工续期,且申请流程复杂,不建议。
StartSSL申请全过程:http://www.laozuo.org/2823.html
SSL的相关参数
ssl
语法:ssl [on|off]
默认值:ssl off
使用字段:main, server
开启HTTPS。
ssl_certificate
语法:ssl_certificate file
默认值:ssl_certificate cert.pem
使用字段:main, server
为这个虚拟主机指定PEM格式的证书文件,这个文件可以包含其他的证书和服务器私钥,同样,密钥也必须是PEM格式,0.6.7版本以后,这里的路径为相对于nginx.conf的路径,而不是编译时的prefix路径。
ssl_certificate_key
语法:ssl_certificate_key file
默认值:ssl_certificate_key cert.pem
使用字段:main, server
为这个虚拟主机指定PEM格式的私钥,0.6.7版本以后,这里的路径为相对于nginx.conf的路径,而不是编译时的prefix路径。
ssl_client_certificate
语法:ssl_client_certificate file
默认值:none
使用字段:main, server
指出包含PEM格式的CA(root)证书,它将用于检查客户端证书。
ssl_dhparam
语法:ssl_dhparam file
默认值:none
使用字段:main, server
该指令指定了一个PEM格式的文件,其中包含的Diffie-Hellman密钥协商协议密码参数,它将用于服务器和客户端之间的会话密钥交换。
ssl_ciphers
语法:ssl_ciphers file
默认值:ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
使用字段:main, server
指出为建立安全连接,服务器所允许的密码格式列表,密码指定为OpenSSL支持的格式,如:
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
查看当前安装的OpenSSL版本所支持的密码列表,可以使用下列命令:openssl ciphers
ssl_crl
语法:ssl_crl file
默认值:none
使用字段:http, server
指令可用于0.8.7以后版本,用于指定一个证书吊销列表的文件名,使用PEM格式,它将用于检查证书吊销状态。
ssl_prefer_server_ciphers
语法:ssl_prefer_server_ciphers [on|off]
默认值:ssl_prefer_server_ciphers off
使用字段:main, server
依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码。
ssl_protocols
语法:ssl_protocols [SSLv2] [SSLv3] [TLSv1]
默认值:ssl_protocols SSLv2 SSLv3 TLSv1
使用字段:main, server
指定要开启的SSL协议。
ssl_verify_client
语法:ssl_verify_client on|off|optional
默认值:ssl_verify_client off
使用字段:main, server
启用客户端身份验证,参数“optional”将使用客户端提供的证书检查它的权限(0.8.7与0.7.63版本之前为”ask”)。
ssl_verify_depth
语法:ssl_verify_depth number
默认值:ssl_verify_depth 1
使用字段:main, server
设置服务器按顺序检查客户端提供的证书链的长度。
ssl_session_cache
语法:ssl_session_cache off|none|builtin:size and/or shared:name:size
默认值:ssl_session_cache off
使用字段: main, server
设置储存SSL会话的缓存类型和大小。
缓存类型为:
off - 强制关闭:nginx告诉客户端这个会话已经不能被再次使用。
none - 非强制关闭:nginx告诉客户端这个会话可以被再次使用,但是nginx实际上并不使用它们,这是为某些使用ssl_session_cache的邮件客户端提供的一种变通方案,可以使用在邮件代理和HTTP服务器中。
builtin - 内建OpenSSL缓存,仅能用在一个工作进程中,缓存大小在会话总数中指定,注意:如果要使用这个类型可能会引起内存碎片问题,具体请查看下文中参考文档。
shared - 缓存在所有的工作进程中共享,缓存大小指定单位为字节,1MB缓存大概保存4000个会话,每个共享的缓存必须有自己的名称,相同名称的缓存可以使用在不同的虚拟主机中。
可以同时使用两个缓存类型,内建和共享,如:
ssl_session_cache builtin:1000 shared:SSL:10m;
但是,使用共享缓存而不使用内建缓存将更为有效。
0.8.34版本之前如果ssl_verify_client设置为'on'或者'optional'时这里不能设置为none或off。
注意,为了让缓存恢复工作,你需要在服务器为SSL socket配置默认服务器,例如:
listen [::]:443 ssl default_server;
这是因为缓存的重用发生在任何TLS扩展启用之前,即服务器名称认证(Server Name Identification (SNI)),来自一个指定IP地址(服务器)的ClientHello信息请求一个会话ID,为了使其工作,默认(default)服务器必须被设置。
最好的方法是将ssl_session_cache放到http字段,这样下面配置的server/虚拟主机字段都将得到相同的SSL缓存配置。
ssl_session_timeout
语法:ssl_session_timeout time
默认值:ssl_session_timeout 5m
使用字段: main, server
设置客户端能够反复使用储存在缓存中的会话参数时间。
ssl_engine
语法:ssl_engine
指定使用的OpenSSL引擎,如Padlock,例如PadLock,下列命令可以查看你的OpenSSL支持的引擎:openssl engine
Debian系统在版本0.9.8o的OpenSSL运行后返回:
openssl engine
(padlock) VIA PadLock (no-RNG, no-ACE)
(dynamic) Dynamic engine loading support
内置变量
ngx_http_ssl_module模块支持下列内建变量:
$ssl_cipher - 返回建立的SSL连接中那些使用的密码字段。
$ssl_client_serial - 返回建立的SSL连接中客户端证书的序列号。
$ssl_client_s_dn - 返回建立的SSL连接中客户端证书的DN主题字段。
$ssl_client_i_dn - 返回建立的SSL连接中客户端证书的DN发行者字段。
$ssl_protocol - 返回建立的SSL连接中使用的协议。
$ssl_session_id - 需要0.8.20以上版本。
$ssl_client_cert
$ssl_client_raw_cert
$ssl_client_verify - 如果客户端证书审核通过,这个变量为“SUCCESS”。
非标准错误代码
这个模块支持一些非标准的HTTP错误代码,可以借助error_page指令用于调试:
495 - 检查客户端证书时发生错误。
496 - 客户端无法提供必须的证书。
497 - 传送到HTTPS的普通请求。
在请求完整的废除后调试完成,并取得一些内置变量,如:$request_uri, $uri, $arg等。
参考:
安装SSL证书:http://zh.wikihow.com/%E5%AE%89%E8%A3%85SSL%E8%AF%81%E4%B9%A6
在Docker里的web开启SSL:https://en.abnerchou.me/Blog/75027340
IIS 部署证书
证书申请
购买证书时需要生成的CSR代码
参考:https://www.namecheap.com/support/knowledgebase/article.aspx/467/67/how-do-i-generate-a-csr-code
SSL证书导入
中间证书导入(有中间证书就导入,没有就不用导入)(在 Microsoft IIS 8 中安装中级证书的步骤):https://sg.godaddy.com/zh/help/microsoft-iis-8-ssl-4951
安装证书:(在 Microsoft IIS 8 中安装 SSL 证书的步骤):
https://sg.godaddy.com/zh/help/microsoft-iis-8-ssl-4951
https://support.comodo.com/index.php?/Knowledgebase/Article/View/1159/0/certificate-installation-microsoft-iis-8x
域名证书导入:IIS中选择“证书管理”-->import然后按提示完成。
IIS+Nginx
一般IIS都是经过nginx反代的。
nginx反向代理IIS一键部署https(本人未测试,搬运)
:: $Name: win-ssl.bat
:: $Version: v1.0
:: $Function: nginx反向代理IIS一键部署https
:: $Author: Ropon
:: $organization: west.cn
:: $Create Date: 2017-3-10
:: $Description: 1、nginx反向代理IIS一键部署https
:: 2、支持预装环境及纯净版使用iis web环境
:: 3、部署后nginx配置文件推荐放到d:/nginx/conf/vhost/目录下
:: 4、证书路径d:/nginx/ssl 以域名命名www.test.com.crt www.test.com.key
:: 5、部署后nginx站点配置文件名为www.test.com.conf
::
@echo off&setlocal enabledelayedexpansion
set base=http://download.myhostadmin.net/php/ioncube
if not exist %cd%\wget.exe (
echo.
echo 缺少wget.exe程序
explorer.exe http://download.myhostadmin.net/wget.exe
echo 正在下载wget.exe必要程序,请保存到当前目录下
echo 下载完成后按任意键继续
pause
)
if not exist %cd%\wget.exe (
echo.
echo 自动头下载失败请访问 http://download.myhostadmin.net/wget.exe 手动下载
echo 并保存到当前目录
echo.
pause
exit
)
echo.
if not exist %cd%\sed.rar (
call:download http://download.myhostadmin.net/memcache/sed.rar %cd%\sed.rar
"C:\Program Files\WinRAR\rar.exe" x -inul -o+ %cd%\sed.rar %cd% -y
cls
)
goto menu
:menu
echo.
echo Nginx反向代理IIS,部署多个https站点
echo.
set path=D:\nginx\
set sslpath=D:\ssl
C:\Windows\system32\cacls D:\ssl /e /g nginx:f /T
if not exist %sslpath% (
md %sslpath%
)
call:existfloder %path%
echo 请输入域名:
echo.比如:www.test.com
set /p domain=
set "URL=http://ip.chinaz.com/getip.aspx"
for /f "tokens=2 delims='" %%a in ('wget -q "%URL%" -O -') do (
set "PublicIP=%%a"
)
set b=listen "%PublicIP%":443;
echo 是否我司申请证书,若是需要先合并:
echo.
echo.
echo 1 是
echo 2 不是
echo.
set /p crtchoice=
if %crtchoice% ==1 goto crt11
if %crtchoice% ==2 goto crt22
:crt11
echo 请输入crt1证书路径:
echo.比如:d:\www.test.com.cer
:crta
set /p crt1=
call:existssl %crt1% crta
C:\Windows\system32\more "%crt1%" > "%cd%\%domain%.crt"
set crttemp=%crt1:~0,-4%
set crt2temp=%crttemp%_ca.crt
set keytemp=%crttemp%.key
if exist %crt2temp% ( C:\Windows\system32\more "%crt2temp%" >> "%cd%\%domain%.crt" ) else ( echo 请输入crt2证书路径:
echo.比如:d:\www.test.com_ca.crt
echo.
:crtb
set /p crt2=
call:existssl %crt2% crtb
C:\Windows\system32\more "%crt2%" >> "%cd%\%domain%.crt"
)
copy "%cd%\%domain%.crt" "%sslpath%\%domain%.crt" >nul 2>nul
set crt="d:\\ssl\\%domain%.crt"
goto key11
:crt22
echo 请输入crt证书路径:
echo.比如:d:\www.test.com.crt
:crtc
set /p crt3=
call:existssl %crt3% crtc
copy "%crt3%" "%sslpath%\%domain%.crt" >nul 2>nul
set crt="d:\\ssl\\%domain%.crt"
goto key11
:key11
if exist %keytemp% ( copy "%keytemp%" "%sslpath%\%domain%.key" >nul 2>nul ) else ( echo 请输入key证书路径:
echo.比如:d:\www.test.com.key
:keya
set /p key1=
call:existssl %key1% keya
copy "%key1%" "%sslpath%\%domain%.key" >nul 2>nul
)
set key="d:\\ssl\\%domain%.key"
copy "%path%conf\temp.conf" "%path%conf\vhost\%domain%.conf" >nul 2>nul
%cd%\sed\sed.exe -i "/ssl/a\ %b%" %path%conf\vhost\%domain%.conf
%cd%\sed\sed.exe -i "/listen/a\ server_name %domain%;" %path%conf\vhost\%domain%.conf
%cd%\sed\sed.exe -i "/server_name/a\ ssl_certificate %crt%;" %path%conf\vhost\%domain%.conf
%cd%\sed\sed.exe -i "/ssl_certificate/a\ ssl_certificate_key %key%;" %path%conf\vhost\%domain%.conf
%cd%\sed\sed.exe -i "/listen 80;/a\ server_name %domain%;" %path%conf\vhost\%domain%.conf
echo.
echo 正在重载nginx服务……
echo.
C:\Windows\system32\net stop nginxd
C:\Windows\system32\net start nginxd
echo 安装完成,请关闭窗口
echo.
echo.
echo 1 继续部署其他域名
echo 2 清理下载文件并提出
echo 0 退出
echo.
set /p choice=
if %choice% ==1 goto menu
if %choice% ==2 goto del
if %choice% ==0 goto exit
:download
echo.
echo 正在下载所需组件
echo.
%cd%\wget.exe %~1 -O %~2
goto:eof
:existssl
echo.
if not exist %~1 (
echo.
echo 输入证书路径不对,请重新输入
echo.
goto %~2
)
:existfloder
echo.
if not exist %~1 (
call:download http://download.myhostadmin.net/nginx.rar d:\nginx.rar
"C:\Program Files\WinRAR\rar.exe" x -inul -o+ d:\nginx.rar d:\ -y
echo.
echo 核实当前服务器没有安装Nginx反向代理环境
echo.
echo 请手动运行d:\nginx\install.bat 初始化环境
echo.
pause
exit
)
goto:eof
:del
echo.
echo 正在清理之前下载文件及文件夹……
echo.
for /f "delims=" %%i in ('dir /b /a-d /s "sed*"') do del %%i
rd /s/q %cd%\sed
pause
exit
:exit
exit
原文:https://www.idiyrom.com/28.html
SSL 安全级别
检测网址:
https://myssl.com
https://www.ssllabs.com/ssltest/index.html
Windows系统
IIS快速修改加密方法:https://www.mf8.biz/windows-server-2016-iis-https-h2/
关闭加密级别比较低的协议,缓解贵宾犬(POODLE)等漏洞的影响。以下内容保存为reg文件,合并注册表即可。关闭了SSL3.0、TLS1.0、RC4;其他是操作系统默认的;一定要重启系统才能生效。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman]
"Enabled"=dword:00000000
参考:
https://samrueby.com/2015/06/08/how-to-disable-sslv3-and-rc4-ciphers-in-iis/
https://www.digicert.com/ssl-support/iis-disabling-ssl-v3.htm
https://support.microsoft.com/zh-cn/help/3206898/enabling-iis-manager-and-web-deploy-after-disabling-ssl3-and-tls-1-0
https://blog.csdn.net/kirawoo/article/details/78737242
一键脚本:https://www.cnblogs.com/JangoJing/p/6769759.html
Linux
修改为以下内容可以获取A+的安全级别。
Nginx修改SSL配置,ssl_ciphers修改为以下内容。
# 证书文件
ssl_certificate /xxxxxxxxxxx/fullchain.pem;
ssl_certificate_key /xxxxxxxxxxx/privkey.pem;
# 生成dhparam.pem文件:openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# Nginx SSL算法
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!ADH:!DH:!DHE";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
# 重用加密的会话
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;
# 增加HSTS文件头
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
参考:https://www.cnblogs.com/kamil/p/6268141.html
https://blog.myssl.com/https-security-best-practices
评论区