首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grpc :在服务器上设置SSLContext

Grpc :在服务器上设置SSLContext
EN

Stack Overflow用户
提问于 2018-10-29 14:43:54
回答 1查看 2.2K关注 0票数 0

我想在我的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 -new -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

Conver to pkcs8

openssl pkcs8 -topk8 -nocrypt -in server.key -out pkcs8_key.pem

现在我有了我的server.certpkcs8_key.pem文件,我已经创建了这样的服务器:

代码语言:javascript
复制
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();

类路径被正确配置。

我得到的错误堆栈:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2018-10-29 16:12:39

异常是由以下一行引起的:

代码语言:javascript
复制
SslContext sslContext = GrpcSslContexts
    .forServer(certChain, privateKey, "password").build();

由于您的pkcs8密钥没有密码,所以不应该传递密码,而应该使用两个参数方法:

代码语言:javascript
复制
SslContext sslContext = GrpcSslContexts
    .forServer(certChain, privateKey).build();

请注意,调用useTransportSecurity()将覆盖对sslContext()的调用,因此不应同时调用两者。这两个调用都会中断当前代码,因为forServer()会消耗和关闭提供的InputStream,因此您将将关闭的流传递给useTransportSecurity()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53047940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档