HTTPS证书申请相关笔记
申请免费的HTTPS证书相关资料
参考资料:
一、Let’s Encrypt
二、TrustAsia
三、AlwaysOnSSL
四、Comodo
五、Cloudflare
六、AlphaSSL
HTTPS 检测
苹果ATS检测
2017年1月1日起,苹果强制所有 app 满足 HTTPS,即 iOS9 推出的 App Transport Security (ATS) 特性。
输入域名,检查您的 iOS app 是否满足 ATS 特性。
什么是ECC证书?
- 生成、签署 ECC 证书,Nginx 部署双证书教程 – 米饭粑
椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学,其更适合于移动互联网,有更好的安全性和更好的性能。ECC加密算法 1985年 提出,到 2005 年才在各种操作系统中获得广泛支持,2015 年开始被普遍性的部署。
可用于 ECDHE 数字签名的算法主要有 RSA 和 ECDSA 内置 ECDSA 公钥的证书一般被称之为 ECC 证书,内置 RSA 公钥的证书就是 RSA 证书。
渠道2: Let's Encrypt
- Let's Encrypt - Free SSL/TLS Certificates 官网
- 官方申请工具客户端列表 ACME Client Implementations - Let's Encrypt - Free SSL/TLS Certificates
- 服务状态检测 Let's Encrypt Status
优点
- 开源免费
- 支持通配符域名证书
- HTTPS证书支持iOS企业版下载
缺点
- 证书有效期3个月
Let's Encrypt 的是否支持非80,443的其它端口来验证?
答案是: NO,不支持! 因为安全问题!
此类问题解决方案就是使用DNS验证.
参考资料:
I’ve been working on this project since 2012 and I can assure you that it was never possible to get a certificate via validation to port 8080! The HTTP-01 challenge has always required the use of port 80.
Port 80 and 443 Blocked By ISP - How to authenticate domain? - Let's Encrypt Community Support
Delegate the applications subdomain’s DNS and use LetsEncrypts domain validation option.
Support for ports other than 80 and 443 - Feature Requests - Let's Encrypt Community Support
If someone starts the software on port 81 or 8080 (non-root port, any user can use the port) on a shared server. He/she can validate all domains point to that server since the A records points to IP address, and get certificate to do MITM attack.
Letsencrypt doesnt work for different ports - Server - Let's Encrypt Community Support
Using the DNS-01 challenge type does not require any open ports and is currently your only option if you’re unable to use port 80 (with HTTP-01) and 443 (with TLS-SNI-01). The validation is performed through a TXT record you need to add to your DNS.
申请工具4: acme.sh
- 官方地址:Neilpang/acme.sh: A pure Unix shell script implementing ACME client protocol
- 官方文档:How to use DNS API · Neilpang/acme.sh
优点
- 支持功能全
- 日志信息足够详细
缺点
- 安装很麻烦
常用命令
# 使用测试服务器签发证书(防止正式服务器签发错误次数太多被封锁)
# --staging
# export ACME_VERSION=2
# 通过 WebRoot 方式
acme.sh --issue -d bh.baixiangfood.com -w wwwroot --debug
# 第一次
export DP_Id="123456"
export DP_Key="asfadsfsdfasdfasdfasdfsdfasdfasdfasdf"
acme.sh --issue -d azyk.net -d '*.azyk.net' --dns dns_dp --debug
acme.sh --issue -d baixiangfood.azyk.net -d '*.baixiangfood.azyk.net' --dns dns_dp --debug
# 第一次之后
acme.sh --renew -d azyk.net --force --debug
# 导出相关证书到指定地方
acme.sh --install-cert -d azyk.net --key-file my.key --fullchain-file myfullchain.cer --debug
# 生成 .pfx 格式供 IIS 导入使用
# 因为 `fullchain.cer` = `ca.cer` + `*.azyk.net.cer`所以导入 IIS 里的时候选择 `fullchain.cer` 才能一步到位,
# 否则会提示,证书不受信任,因为可能缺少 `ca.cer` 的原因.
#openssl pkcs12 -export -out azyk.net.pfx -inkey '*.azyk.net.key' -in '*.azyk.net.cer'
openssl pkcs12 -export -out my.pfx -inkey my.key -in myfullchain.cer
如何申请证书?
参考资料:
获取免费的 Let’s Encrypt 泛域名 SSL 证书 - VirCloud's Blog - Learning&Sharing
#教程# 获取免费的Let’s Encrypt泛域名野卡证书
注意事项:第一个 -d 后面不可以直接写 *.xx.com ,一定要写个普通单域名,第二个 -d 后面可以写泛域名。建议使用3个 -d,即 @,www,和*.
将子域名的验证权限用别的DNS服务商处理?
参考资料:
Linux 下使用 acme.sh 和 NS 代管申请 Let's Encrypt 免费通配符证书 - 烧饼博客
一种折衷的方法,将 ACME 认证域名单独托管至支持 API 的 DNS 服务商。即使 API Key 泄露,攻击者也无法篡改网站的其它 DNS 记录。
本例采用的方法是 NS 代管一个任意子域名,然后利用 CNAME 转发 ACME 挑战子域名。
本例假设你拥有两个域名 example.com 和 example.org,现在希望将 acme.example.com 转交由 DigitalOcean 域名托管服务代管,并将两个域名的 ACME 挑战子域名转发至这个子域名。DNS alias mode · Neilpang/acme.sh Wiki · GitHub
Do not remove the CNAME like : _acme-challenge.importantDomain.com after you issue the cert. It will be reused when acme.sh tries o renew the cert. The left cname record _acme-challenge.importantDomain.com doesn't harm to your domain at all. Just keep it there.
We have another parameter: --domain-alias, it has the same meaning with --challenge-alias.
But with --domain-alias you don't need to add _acme-challenge. prefix.
如何通过 443 端口申请证书?
acme.sh 支持 "tls-sni-01" 认证方式啦, let's encrypt - V2EX
使用 tls 方式验证, 我们使用内置的 openssl server 完成验证, 没有增加新的依赖. 同时需要临时占用本地的 443 端口, 所以请确保443 端口空闲.
Options and Params · Neilpang/acme.sh Wiki · GitHub
--tls Use standalone tls mode.
如何与IIS配合以便能正确签发证书?
方法2:
- 打开 IIS 的对应 80 端口的网站
- 右键
添加虚拟目录
- 别名设置为
.well-known
- 物理路径设置为 Cygwin 的
/home/YOUR_USER_NAME/wwwroot/.well-known
路径对应的 Windows下的路径如:
C:\Cygwin\home\YOUR_USER_NAME\wwwroot\.wel-known
- 然后通过命令
acme.sh --issue -d x.com -w wwwroot
申请证书即可
方法1:
- 通过
mklink /d
将 物理路径设置为 Cygwin 的/home/YOUR_USER_NAME/wwwroot/.well-known
路径对应的 Windows下的路径链接
到 IIS 网站目录下.
DNSPod 服务提供商 泛域名 [野卡] 申请记录:
√申请成功:
*.azyk.net
acme.sh --issue -d '*.azyk.net' --dns dns_dp --debug --staging
√申请成功:
*.sub1.azyk.net
acme.sh --issue -d '*.sub1.azyk.net' --dns dns_dp --debug --staging
√申请成功:
*.sub2.sub1.azyk.net
acme.sh --issue -d '*.sub2.sub1.azyk.net' --dns dns_dp --debug --staging
虽然证书能申请成功,但是在 域名解析控制台 却无法正常添加解析记录,提示:
泛解析级数超出限制
×申请失败:
*.sub3.sub2.sub1.azyk.net
acme.sh --issue -d '*.sub3.sub2.sub1.azyk.net' --dns dns_dp --debug --staging
提示错误信息:
Error add txt for domain:_acme-challenge.sub3.sub2.sub1.azyk.net测试:1. 设置CNAME:_acme-challenge.sub2.sub1
=>_acme-challenge.azyk.net
2. 执行命令:acme.sh --issue -d '*.sub3.sub2.sub1.azyk.net' --challenge-alias azyk.net --dns dns_dp --debug --staging
3. 返回错误: *.sub3.sub2.sub1.azyk.net:Verify error:No TXT record found at _acme-challenge.sub3.sub2.sub1.azyk.net解决方案: 更换DNS服务商
理由: DNSPod 免费版本只支持2级通配符.
参考资料:
DNS alias mode · Neilpang/acme.sh Wiki · GitHub
Even with ACME v2 wildcard cert:
- First set domain CNAME:
_acme-challenge.importantDomain.com => _acme-challenge.aliasDomainForValidationOnly.com - Issue a cert:
acme.sh --issue -d importantDomain.com --challenge-alias aliasDomainForValidationOnly.com --dns dns_cf
- First set domain CNAME:
DNSPod 域名解析 - 全部域名 上方 - 切换到腾讯云控制台 - 域名 - 域名设置 - 解析参数
解析参数:
子域名级别 3级
泛解析级别 2
注意: 以上的解析只是针对二级域名,通配符只能匹配一个级别的子域名,如果是三级域名需要用 *.example来匹配。使用不同套餐版本的解析能设定的泛解析级别数不同。解析套餐版本 泛解析级别 免费套餐 2 个人专业版套餐 4
Linux 下使用 acme.sh 和 NS 代管申请 Let's Encrypt 免费通配符证书 - 烧饼博客
一种折衷的方法,将 ACME 认证域名单独托管至支持 API 的 DNS 服务商。即使 API Key 泄露,攻击者也无法篡改网站的其它 DNS 记录。
本例采用的方法是 NS 代管一个任意子域名,然后利用 CNAME 转发 ACME 挑战子域名。
本例假设你拥有两个域名 example.com 和 example.org,现在希望将 acme.example.com 转交由 DigitalOcean 域名托管服务代管,并将两个域名的 ACME 挑战子域名转发至这个子域名。Let's encrypt 通配域名(二级, 三级) - 个人文章 - SegmentFault 思否
需要在DNS中添加 b.example.com 的A记录, 这样在 Let's encrypt 发起挑战的时候才能解析到这个域名.
1.创建 b.example.com 的A记录
2.执行命令申请通配域名(三级域名)
certbot certonly --manual \ -d '*.b.exampple.com'Acme.sh supports ACME v2 wildcard now - Client dev - Let's Encrypt Community Support
从文中举例来看是支持的-d *.sub.acme.sh
申请证书时出现SERVFAIL looking up CAA for Secondlevel.azyk.net
错误
x.azyk.net
:Verify error:DNS problem: SERVFAIL looking up CAA for Secondlevel.azyk.net
参考资料:
What is a CAA record? - DNSimple Help
Querying CAA records
dig google.com type257Global DNS Propagation Checker - What's My DNS?
支持检测多个国家的DNS解析信息,包括CAA信息.
dig dns lookup and traceroute tools | traceroute-online.com
支持在线查询指定域名的 CAA 记录
Run DIG from our server
using the type ANY flag (-t any)测试
google.com
时返回的结果;; ANSWER SECTION:
……
google.com. 21599 IN CAA 0 issue "pki.goog"支持在线查询指定域名的 CAA 记录
添加CAA记录
您想要只允许由 symantec.com 来颁发域名 midengd.xyz 的证书,并且发送违规通知到邮箱 admin@midengd.xyz。您可以按照以下方式来配置CAA记录。
主机记录 记录值
@ 0 issue “symantec.com”
@ 0 iodef “mailto:admin@midengd.xyz”Linux 下使用 acme.sh 配置 Let's Encrypt 免费 SSL 证书 + 通配符证书 - 烧饼博客
给 example.com 增加一个 CAA 记录为 0 issue "letsencrypt.org" 这样可以告诉 Let’s Encrypt 的 CA ,你授权给他们签发 SSL 证书
dig TXT _acme-challenge.example.com @9.9.9.9 +short申请ssl证书报提示caa提示 - weizy81 - 博客园
dig -t TYPE257 example.com
发现我的 PowerDNS 确实是返回了一个 SERVFAIL
CAA 记录由两部分组成:一个 flags 和 一个 tag 对。flags 是一个字节,当前只有最高位被用于 Issuer Critical,代表这个 tag 对的重要性
当前支持的 tag 包括:issue issuewild iodef。
issue 表示允许 CA 机构签署证书,issuewild 表示允许 CA 机构签署 wildcard 证书,iodef 表示签署证书时通过指定的方式通知域名持有者。
在Cygwin里安装 acme.sh 步骤
- 准备好 Cygwin 环境
- 安装好 curl, openssl and crontab
在Windows环境安装Cygwin工具包的步骤
已有.cer和.key文件如何供IIS导入证书?
#openssl pkcs12 -export -out azyk.net.pfx -inkey '*.azyk.net.key' -in '*.azyk.net.cer'
#因为 `fullchain.cer` = `ca.cer` + `*.azyk.net.cer`所以导入 IIS 里的时候选择 `fullchain.cer` 才能一步到位,
#否则会提示,证书不受信任,因为可能缺少 `ca.cer` 的原因.
openssl pkcs12 -export -out azyk.net.pfx -inkey '*.azyk.net.key' -in 'fullchain.cer'
参考资料:
1、在你的服务器上,解压下载的证书 zip 文件,并重命名保存为 your_domain_name.cer。
2、 打开 IIS 管理器,开始菜单(Start)-> 管理工具(Administrative Tools)-> IIS 管理器(Internet Information Services (IIS) Manager)
3、你可以看到连接(Connections)下的主机,点击你服务器的主机名。
4、在中间菜单中,IIS 部分,双击 服务器证书(Server Certificates)。
5、在操作菜单,点击 完成证书请求(Complete Request Certificate) 向导。
6、在完成证书请求向导,指定证书认证响应(Specify Certificate Authority Response)页,选择刚刚解压的文件。
7、填写一个名称,用于辨别该证书是哪张证书。
8、证书安装到这里就完成了。How to Make a .pfx File When Given .crt and .key Files | SherWeb
openssl pkcs12 -export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt
Using Let's Encrypt with IIS on Windows - Rick Strahl's Web Log
This script produces a PFX file which can then be imported into IIS.
There are also tools to install and update existing certificates into IIS but it looks there are currently some changes in the API that made this not work for me. I wasn't able to even get the tools to load.
You can manually install the certificate with:
certutil -importPFX "c:\admin\certs\codepaste2016-02-28--20:22" –p passwordiis - IIS7: How to import public key and private key as two seperate files? - Server Fault
签发证书成功后产生的文件及其各自用途
例子:通配符域名生成成功后产生了以下文件:
'./.acme.sh/*.azyk.net':
'*.azyk.net.cer'
'*.azyk.net.conf'
'*.azyk.net.csr'
'*.azyk.net.csr.conf'
'*.azyk.net.key'
ca.cer
fullchain.cer
各种后缀的文件意义和用途相关参考资料:
letsencrypt fullchain.pem is cert.pem + chain.pem | Awhan Patnaik
here is how you verify that fullchain.pem is just a concatenation of cert.pem and chain.pem.
Please note that the order of those two files is important
diff fullchain.pem <(cat cert.pem chain.pem)
得此灵感通过Beyond Compare工具对比 之后发现的确是 fullchain.cer
= ca.cer
+ *.azyk.net.cer
所以导入 IIS 里的时候选择 fullchain.cer
才能一步到位,否则会提示,证书不受信任,因为可能缺少 ca.cer
的原因.
how to update acme.sh · Issue #187 · Neilpang/acme.sh
我放在nginx配置文件里面的只有fullchain.cer和domain.com.key
那么其他文件是什么作用?
其他的文件没有作用, 为的是别的服务器,不光是nginx。 你需要什么就指定什么,别的不管。获取免费的 Let’s Encrypt 泛域名 SSL 证书 - VirCloud's Blog - Learning&Sharing
[Sat Mar 17 16:10:54 CST 2018] The intermediate CA cert is in /root/.acme.sh/owen.ml/ca.cer
[Sat Mar 17 16:10:54 CST 2018] And the full chain certs is there: /root/.acme.sh/owen.ml/fullchain.cercert.pem #server cert only
privkey.pem #private key
chain.pem #intermediates
fullchain.pem #server cert + intermediates[Solved] Why isn't my certificate trusted? - Server - Let's Encrypt Community Support
The difference is, the ‘chain.pem’ file contains a cross signature from an IdenTrust root which is present in most browsers today.
The ‘fullchain.pem’ references the ISRG root certificate, which is not yet present in most browsers as Let’s Encrypt are still in the process of applying to have it included.Currently both files should be based on the same chain provided by the Let’s Encrypt CA,
So when I downloaded ‘fullchain.pem’ via FTP and renamed it to ‘fullchain.crt’ to check it, I ended up with an error “this certificate cannot be verified up to a trusted certification authority”. But downloading ‘chain.pem’ and renaming it ‘chain.crt’ showed me the cross signed intermediate.
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件
正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误 SSL中,公钥、私钥、证书的后缀名都是些啥? - 刘长元的回答 - 知乎
CA,certificate authority。证书局,用于制作、认证证书的第三方机构,我们假设营业执照非常难制作,就像身份证一样,需要有制证公司来提供,并且提供技术帮助工商局验证执照的真伪。
那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等) - guogangj - 博客园
CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于NIX系统,
CER - 还是certificate,还是证书,常见于Windows系统,
KEY - 通常用来存放一个公钥或者私钥,
CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥
PFX/P12 - predecessor of PKCS#12,对nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码What is the difference between a .CRT and a .CER file?
The file extensions .CRT and .CER are interchangeable.
申请工具3: 浏览器在线申请 SSL For Free Online
- Get HTTPS for free!
- SSL For Free - Free SSL Certificates in Minutes
- FreeSSL.org - 一个申请免费HTTPS证书的网站
- 域名型(DV)免费SSL证书 - SSL 证书 - 文档首页 - 腾讯云文档平台 - 腾讯云
优点
- 在线即可用,不需要安装任何软件
缺点
- 国内某些域名无法正常访问导致无法签发证书
- 需要全手动配置
- 无法自动续签
申请工具2: Certify SSL Manager
manage free https certificates for IIS
The app is free for up to 5 managed sites per server
官方地址:Certify Your Windows IIS Website - simple free certificates powered by Let's Encrypt
下载地址:Certify Your Windows IIS Website - simple free certificates powered by Let's Encrypt
优点
- 有UI运行界面
- 大部分情况一路点击即可完成,需要手动设置的很少
- 支持自动配置 IIS 的 MIME 类型
- 支持在请求证书前自我检查配置是否正常
- 自动续签证书实践时有效.
缺点
- 许多选项不太明白啥功能
- 证书申请失败时错误信息不够详细(无法辅助排查某些特殊情况下无法正常签发证书的问题原因)
使用步骤简述
- 下载最新版本
- 安装并运行
- TODO
如何自动续签证书?
程序本身有这个功能。 原理是:通过安装成系统服务的形式. 但是实际操作过程中,能够成功生效并续签.
申请工具1: Windows ACME Simple (WACS)
A simple ACME client for Windows - for use with Let's Encrypt. (Formerly known as letsencrypt-win-simple (LEWS))
官方地址:PKISharp/win-acme: win-acme - A Simple ACME Client for Windows (for use with Let's Encrypt)
下载地址:Releases · PKISharp/win-acme
优点
- 手动操作比较多,相对比较灵活?
缺点
- 命令行运行界面
- 需要手动输入域名,网站地址
- 需要手动配置 IIS 的 MIME 类型
- 自动续签证书实践不成功.
- 证书申请失败时错误信息不够详细(无法辅助排查某些特殊情况下无法正常签发证书的问题原因)
使用步骤简述
- 下载最新版本
- 解压后运行
letsencrypt.exe
- 输入
M
开始手动申请 - TODO
如何自动续签证书?
程序本身有这个功能。 原理是:通过创建一个系统任务计划任务来运行. 但是实际操作过程中,一直未成功生效过.囧
渠道1: StartSSL
优点
- 证书有效期1年
- 老牌子
缺点
- HTTPS证书不支持iOS企业版下载
- 被国内公司玩坏了?
申请新域名证书的步骤
参考资料:
二次登录网站的步骤
- 双击"StartSSL登录证书.pfx" 导入 密码:xxx
- 登录网站:https://www.startssl.com/ - 点击“Authenticate”
如何续签登录证书?
续签时,使用原来的帐号重新注册,即可。
附件列表