簡體   English   中英

Grpc Java:在服務器上設置SSLContext

[英]Grpc Java : Set up SSLContext on Server

我想在我的GRPC服務器上設置SSL。 為此,我需要證書鏈和pkcs8私鑰。

我已經完成以下工作:

生成CA密鑰:

openssl genrsa -des3 -out ca.key 4096

生成CA證書:

openssl req -new -x509 -days 365 -key ca.key -out ca.crt

生成服務器密鑰:

openssl genrsa -des3 -out server.key 4096

生成服務器簽名請求:

openssl req-新-key server.key -out server.csr

自簽名服務器證書:

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

從服務器密鑰中刪除密碼:

openssl rsa -in server.key -out server.key

轉換為pkcs8

openssl pkcs8 -topk8 -nocrypt-輸入server.key -out pkcs8_key.pem


現在我有了server.certpkcs8_key.pem文件,我已經這樣創建了服務器:

InputStream certChain = MyServer.class.getResourceAsStream("/server.crt");
        InputStream privateKey = MyServer.class.getResourceAsStream("/pkcs8_key.pem");
        SslContext sslContext = GrpcSslContexts.forServer(certChain, privateKey, "password").build();


        Server server = NettyServerBuilder.forPort(8080)
                            .sslContext(sslContext)
                            .addService(new ChatService())
                            .addService(new HelloWorldService())
                            .useTransportSecurity(certChain, privateKey)
                            .build();

類路徑已正確配置。

我得到的錯誤堆棧:

Exception in thread "main" java.lang.IllegalArgumentException: Input stream does not contain valid private key.
    at io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder.keyManager(SslContextBuilder.java:296)
    at io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder.forServer(SslContextBuilder.java:104)
    at io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts.forServer(GrpcSslContexts.java:162)
    at server.MyServer.main(MyServer.java:20)
Caused by: java.io.IOException: overrun, bytes = 2353
    at javax.crypto.EncryptedPrivateKeyInfo.<init>(EncryptedPrivateKeyInfo.java:92)
    at io.grpc.netty.shaded.io.netty.handler.ssl.SslContext.generateKeySpec(SslContext.java:978)
    at io.grpc.netty.shaded.io.netty.handler.ssl.SslContext.getPrivateKeyFromByteBuffer(SslContext.java:1034)
    at io.grpc.netty.shaded.io.netty.handler.ssl.SslContext.toPrivateKey(SslContext.java:1024)
    at io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder.keyManager(SslContextBuilder.java:294)
    ... 3 more

異常是由以下行引起的:

SslContext sslContext = GrpcSslContexts
    .forServer(certChain, privateKey, "password").build();

由於您的pkcs8密鑰沒有密碼,因此您不應傳遞密碼,而應使用兩種參數的方法:

SslContext sslContext = GrpcSslContexts
    .forServer(certChain, privateKey).build();

請注意,調用useTransportSecurity()將覆蓋對sslContext()調用,因此您不應同時調用兩者。 調用這兩種方法都會中斷當前代碼,因為forServer()會消耗並關閉提供的InputStream ,因此您需要將關閉的useTransportSecurity()

暫無
暫無

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

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