首页 > 解决方案 > 如何在 2019 年使用 Windows 10 从 CRT 创建 BKS 文件

问题描述

我想用 bks 文件固定 ssl。但我不知道该怎么做。我担心的是防止中间的任何人看到我的 android 应用程序的 api 调用。我知道我需要固定 ssl。一种方法是使用改造。(这太容易了)

CertificatePinner certPinner = new CertificatePinner.Builder()
    .add("appmattus.com",
          "sha256/4hw5tz+scE+TW+mlai5YipDfFWn1dqvfLG+nU7tq1V8=")
    .build();

OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .certificatePinner(certPinner)
    .build();

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://appmattus.com")
    .addConverterFactory(GsonConverterFactory.create())
    .client(okHttpClient)
    .build();

使用https://www.ssllabs.com/ssltest/analyze从任何网站获取 sha256 密钥也非常容易 而且我不明白这种方式如何提高安全性。所以我决定在应用程序中使用 pining BKS 文件。但这太难了。

我知道我应该创建 BKS 文件并将其嵌入到 android 应用程序中以进行 ssl 固定。但我无法理解如何在 Windows 10 中创建该 BKS 文件。我发现关于创建 BKS 的信息很少,而且它们太旧而无法在 Windows 中找到 android keytool 或 jre。这只是一个老例子 http://transoceanic.blogspot.com/2011/11/android-import-ssl-certificate-and-use.html 我很笨,我需要你的帮助。提前致谢

标签: androidssl

解决方案


第 1 步:获取您的公钥证书

要获取您的公钥,您可以询问您公司的安全人员,或者您可以从浏览器轻松访问您的端点(api.sample.com 或 sample.com,无论您想在哪里进行 SSL 固定),然后单击绿色锁图标 > 证书。

在此处输入图像描述

然后将证书图标拖放到您的桌面上。完毕。你有一个公共证书。

第 2 步:创建 BKS 文件

您需要下载 bouncy castle jar 来创建 BKS 文件。充气城堡是一个加密 API。您可以从这里下载最新版本。

现在您可以使用 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 固定创建了一个帮助程序类。这个类有 3 个参数。

  • 语境
  • BKS 文件
  • BKS 密码(在命令行中输入)

你可以从这里找到代码

您需要在 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();

推荐阅读