簡體   English   中英

創建用於 Netty Websocket 服務器的自簽名證書

[英]Create self-signed certificate for usage with Netty Websocket Server

我正在嘗試創建用於 Netty (4.1.86) Websocket 服務器的自簽名證書。 它在沒有 SSL 以及使用 SelfSignedCertificate class 創建的證書的情況下運行良好。但是我在使用 openssl 創建自簽名證書時遇到了困難。

這個:

SslContext sslCtx = SslContextBuilder.forServer(new File(certFile), new File(keyFile), password).build();

拋出以下錯誤:

ERROR Thread-5 com..application.NettyWSServer - Exception caught:
java.lang.IllegalArgumentException: File does not contain valid private key: /home/johnny/testbench/application/app.pkcs8.key
        at io.netty.handler.ssl.SslContextBuilder.keyManager(SslContextBuilder.java:386)
        at io.netty.handler.ssl.SslContextBuilder.forServer(SslContextBuilder.java:120)
        at com..application.NettyWSServer.start(NettyWSServer.java:78)
        at com..application.ApplicationLauncher$2.run(ApplicationLauncherncher.java:315)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.security.NoSuchAlgorithmException: 1.2.840.113549.1.5.13 SecretKeyFactory not available
        at java.base/javax.crypto.SecretKeyFactory.<init>(SecretKeyFactory.java:122)
        at java.base/javax.crypto.SecretKeyFactory.getInstance(SecretKeyFactory.java:168)
        at io.netty.handler.ssl.SslContext.generateKeySpec(SslContext.java:1084)
        at io.netty.handler.ssl.SslContext.getPrivateKeyFromByteBuffer(SslContext.java:1170)
        at io.netty.handler.ssl.SslContext.toPrivateKey(SslContext.java:1133)
        at io.netty.handler.ssl.SslContextBuilder.keyManager(SslContextBuilder.java:384)
        ... 4 more

以下是我創建certFile (app.pem) 和keyFile (app.pkcs8.key) 的方法:

openssl genrsa -out app.key 2048

openssl pkcs8 -topk8 -in app.key -out app.pkcs8.key

openssl req -x509 -new -nodes -key app.key -sha256 -days 1024 -out app.pem

根據我的理解,Netty 需要一個 pkcs8 格式的密鑰:

https:/.netty.io/4.1/api/io.netty/handler/ssl/SslContextBuilder.html#forServer-java.io.File-java.io.File-

感謝dave_thompson_085的工作解決方案:

openssl genrsa -out app.key 2048

openssl pkcs8 -topk8 -v1 PBE-SHA1-3DES -nocrypt -in app.key -out app.pkcs8.key

openssl req -x509 -new -nodes -key app.key -sha256 -days 1024 -out app.pem

更確切地說, 默認SSLContext路徑需要 PKCS8 未加密或 PKCS8 加密,使用基於密碼的加密 (PBE) 方案,該方案由 AlgorithmIdentifier 開頭的 OID 唯一定義,如 PKCS5v1 中的方案(現在改名為 PBES1)或PKCS12,但不是 PKCS5v2 中名為 PBES2 的更新/更好的方案系列,因為 PBES2 的 OID——您在異常消息中看到的 1.2.840.113549.1.5.13——沒有標識單個方案,因此是不夠的對於 Java 實例化一個SecretKeyFactory (導致異常)。 openssl pkcs8 -topk8自 2016 年 1.1.0 以來默認使用 PBES2 方案。

但是.netty 4.1 SSLContext.toPrivateKey方法(你可以看到,你的堆棧跟蹤確認SSLContextBuilder調用)將改為使用BouncyCastlePemReader如果可用),Bouncy 可以處理舊的 PBE 方案和 PBES2,以及 OpenSSL“傳統”格式文件根本不是 PKCS8(如果/加密時使用基於 OpenSSL 自己的 PBKDF EVP_BytesToKey的方案)。

因此我認為(但無法測試)您有 3 個選擇:

  1. 供應充氣城堡 我認為您需要 bcprov(或 bcprov-ext)和 bcpkix; 您現在可能需要 bcutil(由於最近版本的重組,我還沒有完全理解)。

  2. 使用非 PBES2 方案加密您的文件。 PBES1 方案現在都已被破壞或很容易被破壞; “最好的”(最不壞的)PKCS12 方案正式命名為pbeWithSHA1And3-KeyTripleDES-CBC (:) 但 OpenSSL 有一個更方便的“簡稱”:

    openssl pkcs8 -topk8 -v1 PBE-SHA1-3DES [-in oldfile -out newfile]

    從技術上講,您也可以通過將默認值保留在非常舊的版本 OpenSSL 上來實現這一點,但這通常更困難 (*),而且在我看來並沒有什么不同。 (* 不適合我,因為我有自己的舊版本存檔,但我很奇怪)

  3. 不要加密你的密鑰文件,(僅)如果你能以其他方式充分保護它。 例如通過對您的系統(和任何備份)的訪問控制:使用:

    openssl pkcs8 -topk8 -nocrypt [-in oldfile -out newfile]

    或者更簡單一點:

    openssl pkey [-in oldfile -out newfile]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM