在我的服务器和客户端之间启用 HTTPS 通信
Enabling HTTPS communication between my server and my client
我已经构建了一个服务器应用程序和一个 android 应用程序。到目前为止,他们通过 http 进行通信,但我在每个请求中发送敏感信息(如 JWT)。因此我需要改用 Https。
我已经生成了 p12 证书。
在服务器端:
- 我已将证书复制到
resources/keystore/sampleName.p12
我已将这些行添加到我的 application.properties
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=samplePassword
server.ssl.key-store=classpath:keystore/sampleName.p12
server.ssl.key-alias=sampleName
在 android 方面,我使用 okHttp 并像这样创建客户端
val httpClient = OkHttpClient.Builder()
.certificatePinner(
CertificatePinner.Builder()
.add(
https://10.0.2.2:8080,
"sha256/lVIcG+gpmlabsq1bW5RbvB+kqVSHKdOFyoxjo9+SLEs="
).build()
)
.build()
我使用 https://10.0.2.2:8080
因为我 运行 仅在本地使用服务器应用程序,而且我还在同一台笔记本电脑上的模拟器上 运行 android 应用程序。
为了得到 sha256/lVIcG+gpmlabsq1bW5RbvB+kqVSHKdOFyoxjo9+SLEs=
我使用了 keytool -list -v -keystore sampleName.p12 -storetype PKCS12 -storepass samplePassword
并将十六进制的 sha256 指纹转换为 base64。
现在,当我尝试向服务器发送任何请求时,我得到一个
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
我显然遗漏了一些东西,但我不知道是什么。还有什么我需要做的吗?还是我做错了什么?或者它只是不应该在本地工作?
请注意,这只是我的练习,我不会在任何真实服务器上实际部署服务器应用程序,也不会发布 android 应用程序。
但我仍然会介绍解决方案,我真的希望它是可靠的并且可以在本地工作。
CertificatePinning 是对正常证书检查的补充。它只会进一步限制证书的选择,因为默认情况下您将为您的主机接受任何证书。
有关现有答案,请参阅 。
或阅读此处
https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/
我已经构建了一个服务器应用程序和一个 android 应用程序。到目前为止,他们通过 http 进行通信,但我在每个请求中发送敏感信息(如 JWT)。因此我需要改用 Https。
我已经生成了 p12 证书。
在服务器端:
- 我已将证书复制到
resources/keystore/sampleName.p12
我已将这些行添加到我的
application.properties
server.ssl.key-store-type=PKCS12 server.ssl.key-store-password=samplePassword server.ssl.key-store=classpath:keystore/sampleName.p12 server.ssl.key-alias=sampleName
在 android 方面,我使用 okHttp 并像这样创建客户端
val httpClient = OkHttpClient.Builder()
.certificatePinner(
CertificatePinner.Builder()
.add(
https://10.0.2.2:8080,
"sha256/lVIcG+gpmlabsq1bW5RbvB+kqVSHKdOFyoxjo9+SLEs="
).build()
)
.build()
我使用 https://10.0.2.2:8080
因为我 运行 仅在本地使用服务器应用程序,而且我还在同一台笔记本电脑上的模拟器上 运行 android 应用程序。
为了得到 sha256/lVIcG+gpmlabsq1bW5RbvB+kqVSHKdOFyoxjo9+SLEs=
我使用了 keytool -list -v -keystore sampleName.p12 -storetype PKCS12 -storepass samplePassword
并将十六进制的 sha256 指纹转换为 base64。
现在,当我尝试向服务器发送任何请求时,我得到一个
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
我显然遗漏了一些东西,但我不知道是什么。还有什么我需要做的吗?还是我做错了什么?或者它只是不应该在本地工作?
请注意,这只是我的练习,我不会在任何真实服务器上实际部署服务器应用程序,也不会发布 android 应用程序。
但我仍然会介绍解决方案,我真的希望它是可靠的并且可以在本地工作。
CertificatePinning 是对正常证书检查的补充。它只会进一步限制证书的选择,因为默认情况下您将为您的主机接受任何证书。
有关现有答案,请参阅
或阅读此处
https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/