keywords:
android https 雙向認證
android GRPC https 雙向認證
ManagedChannel channel = OkHttpChannelBuilder.forAddress("xxx",yyy) .overrideAuthority("zzz") .sslSocketFactory(sslFactory) .build();
1、千萬不要像官網案例那樣設置setPlaintext(true),這個是設置明文,我們用的是密文
2、xxx是服務器的ip,yyy是端口號,zzz是domain(這些參數服務端都會提供給你)
特別注意這個overrideAuthority一定要調用,覆蓋hostname來匹配服務器的證書
3、sslSocketFactory這個方法就是設置密鑰的方法。一般服務端會提供個.pem的密鑰文件,放在raw中。我們把這個密鑰設置到OkHttpChannelBuilder中即可以訪問服務器了,關於sslSocketFactory 網上可以搜索到很多有關的內容。
# Generates client.crt which is the clientCertChainFile for the client (need for mutual TLS only) openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt echo Remove passphrase from client key: openssl rsa -passin pass:1111 -in client.key -out client.key echo Converting the private keys to X.509: # Generates client.pem which is the clientPrivateKeyFile for the Client (needed for mutual TLS only) openssl pkcs8 -topk8 -nocrypt -in client.key -out client.pem # Generates server.pem which is the privateKeyFile for the Server openssl pkcs8 -topk8 -nocrypt -in server.key -out server.pem
gRPC Android SSL/TLS Demo(Android上帶有SSL/TLS加密的gRPC使用詳解)
https://www.jianshu.com/p/2873a8349ca0
src demo:
https://github.com/grpc/grpc-java/blob/015b2fffa31995ff7923b4076f9324d464b7d827/android-interop-testing/app/src/main/java/io/grpc/android/integrationtest/TesterOkHttpChannelBuilder.java
grpc android mutual tls, how to send client certificate and key to server #3887
https://github.com/grpc/grpc-java/issues/3887
OkHttpChannelBuilder API Doc
https://grpc.io/grpc-java/javadoc/io/grpc/okhttp/OkHttpChannelBuilder.html#sslSocketFactory-javax.net.ssl.SSLSocketFactory-
NettyServerBuilder API Doc
https://grpc.io/grpc-java/javadoc/io/grpc/netty/NettyServerBuilder.html#sslContext-io.netty.handler.ssl.SslContext-
https://github.com/grpc/grpc-java/tree/master/examples/example-tls
Aandroid中https請求的單向認證和雙向認證
https://blog.csdn.net/u011394071/article/details/52880062
基於Retrofit實現HTTPS思路
由於Retrofit是基於OkHttp實現的,因此想通過Retrofit實現HTTPS需要給Retrofit設置一個OkHttp代理對象用於處理HTTPS的握手過程。代理代碼如下:
OkHttpClient okHttpClient = new OkHttpClient.Builder() .sslSocketFactory(SSLHelper.getSSLCertifcation(context))//為OkHttp對象設置SocketFactory用於雙向認證 .hostnameVerifier(new UnSafeHostnameVerifier()) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://10.2.8.56:8443") .addConverterFactory(GsonConverterFactory.create())//添加 json 轉換器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加 RxJava 適配器 .client(okHttpClient)//添加OkHttp代理對象 .build();
Android HTTPS 自制證書實現雙向認證(OkHttp + Retrofit + Rxjava)
https://www.jianshu.com/p/64172ccfb73b
# gen client.p12
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name tomcat -CAfile ca.crt -caname root -chain
上面代碼的目的是將 client.crt 和 client.key轉換成 client.p12。.p12格式就是pkcs12的后綴。
然后結合第二個鏈接的結尾那塊所講,把.p12格式轉換成.bks
PS: 生成client.p12時,會輸入密碼,我們要記住這個密碼,后面用得到
# gen client.pem
openssl pkcs8 -topk8 -nocrypt -in client.key -out client.pem
已有ca.crt,ca.csr 和ca.key ,怎么才能創建客戶端的cer 和pem?
服務器端已被同樣的ca證書簽署過。
我自己經過如下步驟:
1.生成客戶端key
openssl genrsa -out client-key.key 1024
2.生成客戶端請求文件
openssl req -new -out client-req.csr -key client-key.key
3.生成客戶端證書(root證書,rootkey,客戶端key,客戶端請求文件這4個生成客戶端證書)
openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA ca.cer -CAkey ca.key -CAcreateserial -days 3650
4.生成客戶端p12格式根證書
openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12
5. 生成pem證書
openssl pkcs12 -in client.p12 -nocerts -nodes -out client.pem