第 1 步:获取您的公钥证书
要获取您的公钥,您可以询问您公司的安全人员,或者您可以从浏览器轻松访问您的端点(api.sample.com 或 sample.com,无论您想在哪里进行 SSL 固定)并点击绿色锁图标 > 证书。
然后将证书图标拖放到您的桌面上。完毕。你有一个公共证书。
第 2 步:创建 BKS 文件
您需要下载 bouncy castle jar 来创建 BKS 文件。充气城堡是一个加密 API。您可以从here 下载最新版本。
现在您可以使用 keytool 和充气城堡提供程序创建 BKS 文件。
keytool -importcert -v -trustcacerts -file "[YOUR_PUBLIC_CERTIFICATE_PATH]" -alias [YOUR_ALIAS] -keystore "[BKS_TARGET_PATH]" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "[BOUNCY_CASTLE_JAR_PATH]" -storetype BKS -storepass [YOUR_PASSWORD]
例如:-
keytool -importcert -v -trustcacerts -file "/user/mert/testcertificate.cer" -alias mytestalias -keystore "/user/mert/desktop/certificate.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "/user/mert/bcprov-jdk15on-159.jar" -storetype BKS -storepass mypassword
此命令将使用您的公共证书创建一个 BKS 文件。如果
要添加多个证书,请使用您的运行此命令
另一个公共证书。该命令将检查目标路径
并将新证书添加到现有的 BKS 文件中,以便 BKS 文件
里面会有两个证书。
让我们将多个证书添加到同一个 BKS 文件中。
keytool -importcert -v -trustcacerts -file "/user/mert/testcertificate.cer" -alias mytestalias -keystore "/user/mert/desktop/certificate.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "/user/mert/bcprov-jdk15on-159.jar" -storetype BKS -storepass mypassword
keytool -importcert -v -trustcacerts -file "/user/mert/testcertificate2.cer" -alias mytestalias2 -keystore "/user/mert/desktop/certificate.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "/user/mert/bcprov-jdk15on-159.jar" -storetype BKS -storepass mypassword
如您所见,我运行相同的命令,keytool 会将另一个证书添加到同一个 BKS 文件中。但请注意,您应该为证书使用不同的别名。
让我们检查一下 BKS 文件是否真的有 2 个证书。要在 BKS 文件中列出证书,您需要运行以下命令
keytool -list -keystore "/user/mert/desktop/certificate.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "/user/mert/bcprov-jdk15on-159.jar" -storetype BKS -storepass mypassword
它将显示 BKS 文件中的公共证书。
我们已经成功创建了一个包含 2 个不同公钥的 BKS 文件。
因此,如果您的应用中有 2 个不同的端点并且端点没有相同的公钥,您可以使用多个证书在您的应用中进行 SSL 固定。
第 3 步:将 SSL 固定应用到 OkHttp 客户端
我为 ssl pinning 创建了一个辅助类。这个类接受 3 个参数。
- 上下文
- BKS 文件
- BKS 密码(在命令行中输入)
你可以从here找到代码
您需要在 res/raw/ 文件夹下找到您的 BKS 文件。
快完成了。您只需将此 SSL pinner 附加到您的 okhttp 客户端即可。
RawCertificatePinner pinner = new RawCertificatePinner(context, R.raw.mycertificate,
"mypassword");
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder = rawCertificatePinner.pinCertificate(builder);
return new Retrofit.Builder()
.client(builder.build())
...
.build();