# 相关概念
SSL证书:在应用HTTPS之前,用户应先配置SSL证书。SSL证书是由证书授权中心(CA)签发的对用户公钥的认证。证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。
HTTPS:Hyper Text Transfer Protocol over Secure Socket Layer。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。
SSL:Secure Sockets Layer。SSL是一个安全协议,它提供使用 TCP/IP 的通信应用程序间的隐私与完整性。因特网的超文本传输协议(HTTP)使用 SSL 来实现安全的通信。
TLS:Transport Layer Security Protocol。TLS是IETF制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。TLS也经常用SSL来指代。
CA:即证书授权中心(CA, Certificate Authority)。CA是负责签发证书、认证证书、管理已颁发证书的机关。用户向CA提出申请后,CA负责审核用户信息,然后对关键信息利用私钥进行”签名”,并公开对应的公钥。客户端可以利用公钥验证签名。
非对称加密:即常见的RSA、DH、EC等算法,算法特点是密钥成对出现,一般称为公钥(公开)和私钥(保密),公钥加密的信息只能私钥解开,私钥加密的信息只能公钥解开。公钥对外公开,私钥由服务器保存。因此掌握公钥的不同客户端之间不能互相解密信息,只能和掌握私钥的服务器进行加密通信,服务器可以实现1对多的通信,客户端也可以用来验证掌握私钥的服务器身份。
CSR:CSR是Certificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时所生成的证书请求文件。证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
PEM:Openssl所使用的文档格式。RFC 1421-1424 (opens new window)。
# 创建证书
可以使用OpenSSL来创建CSR,并通过相关机构(例如:沃通)申请证书,具体操作方法如下:
# 前置任务
在申请证书前,用户应先获取并安装相关工具。
Linux:建议使用OpenSSL。OpenSSL是一个强大的SLL密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
Windows:可供选择的工具包括:IIS Manager,SelfSSL,OpenSSL和Windows PowerShell cmdlets等。
# 使用OpenSSL创建证书
提交证书申请前,用户需在本地生成私钥和证书请求文件(CSR);然后用户可以将CSR提交至CA进行签名认证,也可以通过自签名的方式进行本地测试。具体操作方法如以下示例所示(本示例中使用的工具为OpenSSL)。
(1) 执行命令
openssl genrsa -out my-private-key.pem 2048
,通过RSA算法生成私钥,并保存在my-private-key.pem
文件中。百度开放云支持1024、2048和4096 bits长度的私钥,建议使用2048 bits长度。注意:请妥善保管私钥,避免遗失和泄露。
查看私钥文件的具体内容如下:
-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAtp7N1PA57N6cA73X9WyupkjZYx1bYHZA35gTrGa6ojd8oURW 8cqXD46P0dccfiJ34s1eEMquuMsFTtezVNmMH9elADnKVIRBg/NfwehhLx++eeJ0 CuOT08QB373Lyzud93BefhHfYB295DI42IF8NuC60jWVlfmZG7cBSAPSt24Lya1l PzvEULnDSXgMVyDcOW4v82hcztLhfliFUmrf5Vz/uRJNwBKuMrRIBGu4u8pxplzg ...... 9z+Rm0fnFhc3/945EIic9sUCgYA0ZoqfXOkQ07UnIPwvFKNIIQRTJfY67V6sZt4t l3pbT+BlM2ihS4G4MlSfw4l6lFSPOCsF16RbftOlUPT/ieWWROBFR2tZ1RLNTfmo 3T5w9tyjjYFOxL56sPh5MmTTq9JhtfMn+xxsaPwgASDLbj58x4dRj4y7jHqOMbCE 15QNOQKBgADt2m46ZRnFZNL78Xl93/D0TOXowmjiOtgBhEwsuRnlPuDNMUSF4+OZ CWm17VfZRQSeN81v3N+0jeJkl3GFemC0Zt49pce4H9paZuv9qBvBXzEaOqiJXwE1 Q/92Nt5ldSLaEtuMOqxv8pdRv7jIFox2mnimFxpGpjpyPqRK5YC1 -----END RSA PRIVATE KEY-----
(2) 执行命令
openssl req -sha256 -new -key my-private-key.pem -out csr.pem
,根据系统提示输入相关配置信息,生成CSR文件。其中,-key my-private-key.pem
用来指定步骤1中生成的私钥文件;-out csr.pem
用来指定CSR文件的名称。You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:Beijing Locality Name (eg, city) []:Beijing Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:. Common Name (e.g. server FQDN or YOUR name) []:www.mycompany.com Email Address []:example@mycompany.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:.
查看CSR文件具体内容如下:
-----BEGIN CERTIFICATE REQUEST----- MIICuzCCAaMCAQAwdjELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAO BgNVBAcMB0JlaWppbmcxDjAMBgNVBAoMBUppbWNvMQ4wDAYDVQQDDAVKaW1jbzEj MCEGCSqGSIb3DQEJARYUY2FveW91bmdAZm94bWFpbC5jb20wggEiMA0GCSqGSIb3 ...... 9Dbyxk5csKIR8BHzOaIndEX37fqbw5EGeSQkfGVpoeJXF39jyobMFlrW6vgywgCe 2/8Jnw/oditEdX4c2kY8JzQYHADNoXxG9SR7ZGypd+LeF6utURQk+ol7K1MwzEvX QUsm4FKVeG6ACENqUZrHzwaDAMALxnHz6UHkpoEpmif+exs/cjROmy8w96fmytQv aes433mU7TA9XznzpS28YwBaNDNtBWzgPZ2gTbTY5Q== -----END CERTIFICATE REQUEST-----
执行以上命令时所需填写的内容解释如下表所示:
字段 | 描述 |
---|---|
Country Name | 公司/组织所在国家ISO代码,中国代码为CN,其它国家代码可参考ISO Code (opens new window) |
State or Province Name | 公司/组织所在的省/州名称 |
Locality Name | 公司/组织所在城市名称 |
Organization Name | 公司/组织的名称,此处应该出完整全称 |
Organizational Unit Name | 产品或分支机构名称,可选 |
Common Name | 公司/组织的完全限定域名(FQDN,Fully-Qualified Domain Name),例如: www.mycompany.com |
Email Address | 管理员的Email地址 |
A challenge password | 加密证书请求的密码 |
An optional company name | 可选公司/组织名称 |
(3) 向CA中心提交数字证书认证申请。用户可选择 VeriSign (opens new window)、GeoTrust (opens new window) 等第三方认证机构。
用户也可以执行命令
openssl x509 -req -days 365 -in csr.pem -signkey my-private-key.pem -out my-certificate.pem
,对证书进行自签名,用于网站的测试。其中,-days 365
代表证书有效期为365天;-in csr.pem
用来指定步骤2生成CSR文件;-signkey my-private-key.pem
用来指定用于对CSR进行签名的私钥,本示例中使用步骤1生成的私钥进行签名;-out my-certificate.pem
用来指定生成的证书名称。查看生成的证书文件内容如下:
-----BEGIN CERTIFICATE----- MIIDaDCCAlACCQCNYeeikeNQ0TANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJD TjEQMA4GA1UECAwHQmVpamluZzEQMA4GA1UEBwwHQmVpamluZzEOMAwGA1UECgwF SmltY28xDjAMBgNVBAMMBUppbWNvMSMwIQYJKoZIhvcNAQkBFhRjYW95b3VuZ0Bm b3htYWlsLmNvbTAeFw0xNjA5MjkwNjA1NDVaFw0xNzA5MjkwNjA1NDVaMHYxCzAJ ...... YZZ54dCkVQybjSy8O/tGLi6MDwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQAhhOVe p1yRWvbiag/ObWtxFuhOpWpvVsrYwlbgusoCfulJUtavD33ZCVzp5/Zg6QdhlDi1 XPvmoXfj3HG9tjvyZnAqi8+vyozL6QTCo1mNDGCQyLqwU8b5J0nGe1lpayDF97wL UBQh+685ILSLZA4LnNvsqfVG8CxlJK8nvIWXbW0waMsnglsf1Gj7FcdRFcYeMtSY pniTCET/TtiwDk2+0YTehD8gWiscp/W87sNwpGVKEFD4aGBFTWDG5lYgslJHi/I3 6j4ov3PyZWKVIFWncxFPAtFFDnu7ZnXUxggXIEvYMKYaDcHwssLSuwAqWvhEClif mvIHZCCc1FYI9bNa -----END CERTIFICATE-----
# 证书格式要求
上传证书前,用户需要确保:
证书(包括:服务器证书、私钥、证书链)格式符合PEM格式要求。如果用户从CA收到的证书不是PEM格式的,需要转换成PEM格式。具体要求如下:
证书以
-----BEGIN CERTIFICATE-----
开头,-----END CERTIFICATE-----
结尾;每行64字符,最后一行不超过64字符。
如果用户从CA收到的证书不是PEM格式的,需要转换成PEM格式,几种常见的证书格式转换为PEM格式的方法如下:
DER -> PEM:
证书:
openssl x509 -inform der -in my-certificate.cer -out my-certificate.pem
私钥:
openssl rsa -inform DER -outform PEM -in my-private-key.der -out my-private-key.pem
P7B -> PEM:
证书:
openssl pkcs7 -print_certs -in my-certificate.p7b -out my-certificate.pem
私钥:无私钥
PFX -> PEM:
证书:
openssl pkcs12 -in certname.pfx -nokeys -out my-certificate.pem
私钥:
openssl pkcs12 -in certname.pfx -nocerts -out my-private-key.pem -nodes
服务器证书需要在有效期内(证书开始时间 <= 当前时间 <= 证书失效时间)。
私钥不能加密,即执行生成私钥命令时不能添加密码参数。
服务器证书只能包含一个证书。
私钥需要和服务器证书里的公钥匹配。可以通过以下两条命令生成私钥和证书的MD5值,如果二者一致,则可认为私钥与证书里的公钥匹配。
openssl x509 -noout -modulus -in my-certificate.pem | openssl md5
openssl rsa -noout -modulus -in my-private-key.pem | openssl md5
证书链完整,即通过证书链可以对应到可信根证书。具体要求如下:
证书之间不能有空行;
每一份证书遵守第一项中关于证书的格式要求,示例如下:
-----BEGIN CERTIFICATE----- -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -----END CERTIFICATE-----