證書請求全過程分析
證書請求通常涉及生成密鑰對、創建證書籤名請求(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協議實現:
- **客户端(如Certbot)**生成密鑰對和CSR。
- 域名驗證:通過HTTP-01或DNS-01挑戰驗證域名控制權。
- 證書籤發:驗證通過後,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