SSL 证书简介

2016/09/29 sslhttps

# 相关概念

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-----
    

# 证书格式要求

上传证书前,用户需要确保:

  1. 证书(包括:服务器证书、私钥、证书链)格式符合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

  2. 服务器证书需要在有效期内(证书开始时间 <= 当前时间 <= 证书失效时间)。

  3. 私钥不能加密,即执行生成私钥命令时不能添加密码参数。

  4. 服务器证书只能包含一个证书。

  5. 私钥需要和服务器证书里的公钥匹配。可以通过以下两条命令生成私钥和证书的MD5值,如果二者一致,则可认为私钥与证书里的公钥匹配。

    • openssl x509 -noout -modulus -in my-certificate.pem | openssl md5

    • openssl rsa -noout -modulus -in my-private-key.pem | openssl md5

  6. 证书链完整,即通过证书链可以对应到可信根证书。具体要求如下:

    • 证书之间不能有空行;

    • 每一份证书遵守第一项中关于证书的格式要求,示例如下:

      -----BEGIN CERTIFICATE-----
      
      -----END CERTIFICATE-----
      
      -----BEGIN CERTIFICATE-----
      
      -----END CERTIFICATE-----
      
      -----BEGIN CERTIFICATE-----
      
      -----END CERTIFICATE-----
      
上次更新: 2023/1/2 02:25:24