證書請求全過程分析

證書請求通常涉及生成密鑰對、創建證書籤名請求(CSR)、提交至證書頒發機構(CA)以及最終獲取簽名的證書。以下是詳細流程:

密鑰對生成
使用加密算法(如RSA或ECC)生成公鑰和私鑰。私鑰需嚴格保密,公鑰則包含在CSR中。

創建CSR
CSR包含公鑰、主體信息(如域名、組織名稱等)以及簽名。簽名使用私鑰生成,用於驗證CSR的完整性。

提交至CA
將CSR發送給CA(如DigiCert、Let's Encrypt)。CA驗證請求者身份後,使用其根證書或中間證書對CSR簽名,生成最終證書。

證書頒發與安裝
CA返回簽名的證書(通常為PEM或DER格式)。證書需與私鑰配對安裝在服務器或設備上,用於TLS/SSL通信。


案例分析:Let's Encrypt證書申請

以Let's Encrypt為例,其自動化流程通過ACME協議實現:

  1. **客户端(如Certbot)**生成密鑰對和CSR。
  2. 域名驗證:通過HTTP-01或DNS-01挑戰驗證域名控制權。
  3. 證書籤發:驗證通過後,CA簽發有效期90天的免費證書。

常見問題:

  • 驗證失敗:因DNS配置錯誤或HTTP服務器未正確響應。
  • 續簽問題:自動化腳本未按時執行導致證書過期。

代碼:生成CSR與密鑰(Python)

使用cryptography庫生成RSA密鑰對和CSR:

from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.x509.oid import NameOID

# 生成RSA私鑰
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

# 創建CSR
builder = x509.CertificateSigningRequestBuilder().subject_name(
    x509.Name([
        x509.NameAttribute(NameOID.COUNTRY_NAME, "US"),
        x509.NameAttribute(NameOID.COMMON_NAME, "example.com"),
    ])
).add_extension(
    x509.SubjectAlternativeName([x509.DNSName("example.com")]),
    critical=False
)

# 簽名CSR
csr = builder.sign(
    private_key, hashes.SHA256(), default_backend()
)

# 輸出PEM格式
private_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption()
)
csr_pem = csr.public_bytes(serialization.Encoding.PEM)

print("Private Key:\n", private_pem.decode())
print("CSR:\n", csr_pem.decode())

OpenSSL命令行實現

生成密鑰和CSR:

openssl req -new -newkey rsa:2048 -nodes -keyout example.key -out example.csr

參數説明:

  • -newkey rsa:2048:生成2048位RSA密鑰。
  • -nodes:密鑰不加密。
  • -keyout:私鑰輸出文件。
  • -out:CSR輸出文件。

驗證CSR內容:

openssl req -in example.csr -noout -text