【问题标题】:Unit Testing SSL at REST APIs在 REST API 上对 SSL 进行单元测试
【发布时间】:2016-08-26 12:58:21
【问题描述】:

我有一个通过 SSL 运行的 restlet 应用程序。我为它创建了一个密钥库并从中提取了证书。

我想测试我的 SSL restlet 应用程序,但是我还需要将该证书导入到我的信任库中。我试过了,它似乎在我的机器上工作:

final char sep = File.separatorChar;
File dir = new File(System.getProperty("java.home") + sep + "lib" + sep + "security");
File file = new File(dir, "cacerts");
InputStream localCertIn = new FileInputStream(file);

KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(localCertIn, null);

if (keystore.containsAlias("mycertalias")) {
  localCertIn.close();
  return;
}

localCertIn.close();

InputStream certIn = new FileInputStream("src/test/mycert.cer");
BufferedInputStream bis = new BufferedInputStream(certIn);
CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
  Certificate cert = cf.generateCertificate(bis);
  keystore.setCertificateEntry("mycertalias", cert);
}

certIn.close();

OutputStream out = new FileOutputStream(file);
keystore.store(out, null);
out.close();

但是,它可以使用 null 作为密码并使用 changeitpassword(我的密钥库的密码)。

这段代码不适用于其他计算机(不是通用解决方案)。如果您将您的 java home 放入需要权限的文件路径中,则会引发错误。

那么,有没有办法创建另一个信任库并使用它来测试我的 SSL?

【问题讨论】:

    标签: java ssl restlet


    【解决方案1】:

    根据代码,它应该可以在您的系统或任何其他系统中正常工作。根据我的 ssl 知识,您提取的证书与您的系统有依赖关系。 因此,您必须提取或准备新证书,该证书不仅应该被您的机器信任,还应该被所有机器信任。

    【讨论】:

    • 如何准备一个在所有机器上都可以信任的证书?
    【解决方案2】:

    它在没有密码的情况下工作,因为您在 keystore.store() 方法调用中使用 null 作为密码,请改用。

    keystore.store(out, "password".toCharArray() );
    

    你的,

    【讨论】:

    • password 是我生成证书的密钥库的密码。密码也可以。使用null 有问题吗?
    • 是的,对密钥库的访问受密码保护,如果您不想要密码,可以使用空字符数组而不是 null。 see this previous response
    【解决方案3】:

    我通过这种方式找到了解决方案:我在测试期间将我的密钥库声明为信任密钥库。因此,它已成为其他计算机的通用解决方案。我还为我的测试信任密钥库设置了一个密码,该密码将在我的测试期间使用。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多