自己成為一個證書頒發機構(CA)
為你的微服務架構或者整合測試建立一個簡單的內部 CA。
傳輸層安全(TLS)模型(有時也稱它的舊名稱 SSL)基於證書頒發機構(CA)的概念。這些機構受到瀏覽器和作業系統的信任,從而簽名伺服器的的證書以用於驗證其所有權。
但是,對於內部網路,微服務架構或整合測試,有時候本地 CA更有用:一個只在內部受信任的 CA,然後簽名本地伺服器的證書。
這對整合測試特別有意義。獲取證書可能會帶來負擔,因為這會佔用伺服器幾分鐘。但是在程式碼中使用“忽略證書”可能會被引入到生產環境,從而導致安全災難。
CA 證書與常規伺服器證書沒有太大區別。重要的是它被原生代碼信任。例如,在 Python requests
庫中,可以透過將 REQUESTS_CA_BUNDLE
變數設定為包含此證書的目錄來完成。
在為整合測試建立證書的例子中,不需要長期的證書:如果你的整合測試需要超過一天,那麼你應該已經測試失敗了。
因此,計算昨天和明天作為有效期間隔:
>>> import datetime
>>> one_day = datetime.timedelta(days=1)
>>> today = datetime.date.today()
>>> yesterday = today - one_day
>>> tomorrow = today - one_day
現在你已準備好建立一個簡單的 CA 證書。你需要生成私鑰,建立公鑰,設定 CA 的“引數”,然後自簽名證書:CA 證書總是自簽名的。最後,匯出證書檔案以及私鑰檔案。
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes, serialization
from cryptography import x509
from cryptography.x509.oid import NameOID
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
builder = x509.CertificateBuilder()
builder = builder.subject_name(x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
]))
builder = builder.issuer_name(x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
]))
builder = builder.not_valid_before(yesterday)
builder = builder.not_valid_after(tomorrow)
builder = builder.serial_number(x509.random_serial_number())
builder = builder.public_key(public_key)
builder = builder.add_extension(
x509.BasicConstraints(ca=True, path_length=None),
critical=True)
certificate = builder.sign(
private_key=private_key, algorithm=hashes.SHA256(),
backend=default_backend()
)
private_bytes = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncrption())
public_bytes = certificate.public_bytes(
encoding=serialization.Encoding.PEM)
with open("ca.pem", "wb") as fout:
fout.write(private_bytes + public_bytes)
with open("ca.crt", "wb") as fout:
fout.write(public_bytes)
通常,真正的 CA 會需要證書籤名請求(CSR)來簽名證書。但是,當你是自己的 CA 時,你可以制定自己的規則!可以徑直簽名你想要的內容。
繼續整合測試的例子,你可以建立私鑰並立即簽名相應的公鑰。注意 COMMON_NAME
需要是 https
URL 中的“伺服器名稱”。如果你已配置名稱查詢,你需要伺服器能響應對 service.test.local
的請求。
service_private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
service_public_key = service_private_key.public_key()
builder = x509.CertificateBuilder()
builder = builder.subject_name(x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, 'service.test.local')
]))
builder = builder.not_valid_before(yesterday)
builder = builder.not_valid_after(tomorrow)
builder = builder.public_key(public_key)
certificate = builder.sign(
private_key=private_key, algorithm=hashes.SHA256(),
backend=default_backend()
)
private_bytes = service_private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncrption())
public_bytes = certificate.public_bytes(
encoding=serialization.Encoding.PEM)
with open("service.pem", "wb") as fout:
fout.write(private_bytes + public_bytes)
現在 service.pem
檔案有一個私鑰和一個“有效”的證書:它已由本地的 CA 簽名。該檔案的格式可以給 Nginx、HAProxy 或大多數其他 HTTPS 伺服器使用。
透過將此邏輯用在測試指令碼中,只要客戶端配置信任該 CA,那麼就可以輕鬆建立看起來真實的 HTTPS 伺服器。
via: https://opensource.com/article/19/4/certificate-authority
作者:Moshe Zadka 選題:lujun9972 譯者:geekpi 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- 證書頒發機構
- ca 證書機制
- 證書頒發機構再也不用更改密碼啦!密碼
- 申請SSL證書CA機構的選擇很重要
- TUV南德為元太光伏頒發認證證書
- SGS為美的樓宇科技頒發碳中和證書
- 【重要訊息】這項提議將影響全球證書頒發機構……
- 建立和管理一個 CA 及證書的生命週期
- android 安裝CA證書Android
- 數字證書認證(CA)中心
- TUV萊茵為時代吉利頒發組織碳中和認證證書
- BSI為昕諾飛頒發2021年度碳中和認證證書
- TUV萊茵為楚航科技毫米波雷達頒發歐盟CE RED指令公告機構證書
- 助力零碳發展,BSI為綠動資本頒發ISO 14097認證證書
- TUV萊茵為海克斯康頒發ISO 14064碳核查證書與碳中和認證證書
- Windows證書管理中的安全漏洞,保護系統免受中間人攻擊、偽造證書和其他網路安全威脅。CA信任鏈的管理、證書撤銷機制、證書頒發過程中的人為錯誤。Windows
- TUV萊茵為嘉巨集電動自行車頒發北美cTUVus認證證書
- PKI/CA與數字證書
- https--OpenSSL生成root CA及簽發證書HTTP
- TUV南德為科利爾頒發ATEX和IECEx CoC防爆證書
- ca證書怎樣理解?與恆訊科技的ssl證書一樣嗎?
- 通過Go語言建立CA與簽發證書Go
- 十二張圖:從0開始理解對稱/非對稱加密、CA認證、以及K8S各元件頒發證書原由加密K8S元件
- SGS為博世2022亞太區供應商大會頒發碳中和認證證書
- 如何為自己的個人網站選擇SSL證書?網站
- TUV萊茵為海聯智通IBOX-BPR頒發CE-RED符合性證書和CB證書
- 如何讓自己成為一個專業的高階開發?
- 基於CFSSL工具建立CA證書,服務端證書,客戶端證書服務端客戶端
- SGS通標為粵海置地頒發 ISO 37301合規管理體系認證證書
- BSI為中國移動智家中心頒發ISO五大體系認證證書
- CA數字證書包括哪些內容?
- 使用 OpenSSL 建立私有 CA:1 根證書
- TUV萊茵為萬居隆熱泵產品頒發CE符合性證書
- Windows環境中,為自己的應用新增發行者證書Windows
- SSL證書是一個域名一個證書嗎?多個域名能用一張SSL證書嗎?
- TLS、SSL、CA 證書、公鑰、私鑰。。。今天捋一捋!TLS
- 如何在Ubuntu 20.04中配置CA根證書Ubuntu
- 使用 OpenSSL 建立私有 CA:2 中間證書