成為您自己的證書頒發機構

2021-10-08 04:36:02 字數 4096 閱讀 3038

傳輸層安全性( tls )模型有時由較舊的名稱ssl指稱,它基於證書頒發機構 (ca)的概念。 這些授權機構受到瀏覽器和作業系統的信任,進而簽署伺服器的證書以驗證其所有權。

但是,對於intranet,微服務體系結構或整合測試,有時具有本地ca很有用:僅在內部受信任並依次簽署本地伺服器證書的ca。

這對於整合測試特別有意義。 由於伺服器將要花費幾分鐘的時間,因此獲取證書可能會很麻煩。 但是在**中具有「忽略證書」選項可能會使其在生產中被啟用,從而導致安全災難。

ca證書與常規伺服器證書沒有太大區別。 重要的是它受到本地**的信任。 例如,在請求庫中,可以通過將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, '****** test ca'),

]))

builder = builder.issuer_name(x509.name([

x509.nameattribute(nameoid.common_name, '****** 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必須是httpsurl中的「伺服器名稱」。 如果已配置名稱查詢,則所需的伺服器將在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伺服器的伺服器。

翻譯自:

SSL TLS協議詳解 中 證書頒發機構

ssl tls協議詳解 中 證書頒發機構 ginove 2018 08 05 18 53 13 瀏覽數 4732 技術文章 技術文章頂 2 踩 0 本文翻譯自 想象一下,客戶端瀏覽器正在嘗試與web伺服器通訊,並且想要啟動tls通道。從上面的最後一點來看,為了證明伺服器的身份,客戶端瀏覽器必須具有伺...

如何在Windows中查詢證書頒發機構已頒發的證書

有時候需要看一下證書頒發機構已經頒發出去的證書,看看某個使用者或者某個計算機獲取過的證書有哪些。通常可以在證書頒發機構的mmc中檢視。對於測試環境或者剛開始用的ca來說,這樣檢視挺簡單的。但是對於用了一段時間,頒發了上千張證書的ca來說,就無法直接檢視了,需要用到view選單裡的filter。可以根...

自己頒發SSL證書,瀏覽器不識別解決方法

最新版瀏覽器不認自頒發證書原因解答 最新版瀏覽器改變了證書中網域名稱讀取規則,老版瀏覽器讀取證書中的網域名稱是從證書字段 使用者 中的cn欄位讀取網域名稱在與 匹配,匹配一樣就是有效證書,新版瀏覽器是從證書的擴充套件字段 使用者可選名稱 中讀取網域名稱來匹配 匹配一樣就是有效證書,匹配不一樣就是無效...