【问题标题】:How to test X509TrustManager subclass?如何测试 X509TrustManager 子类?
【发布时间】:2012-05-22 21:44:32
【问题描述】:

我对@9​​87654321@ 进行了子类化,因此我可以使用私有 SSL 证书。现在我正在尝试为我的类编写 JUnit 测试,但测试用例不断给我一个空指针异常。

例如我的checkClientTrusted() 实现是一个空方法。但是,当我使用X509Certificate[](以及任何类型的字符串)的(假定)有效实例调用该方法时,JUnit 会在该行测试代码中报告NullException。关于我缺少什么的任何建议?

【问题讨论】:

  • 您的 checkClientTrusted() 的空实现是不安全的。不要这样做。
  • @EJP - 实际上不,这对我的应用程序来说并不是不安全的。没时间细说,不过就我现在的工作来说,空着也不是问题。
  • RFC 2246 不同意你的观点。

标签: java ssl junit cryptography x509certificate


【解决方案1】:

仅仅为了使用自签名证书而对“X509TrustManager”进行子类化(我认为这就是你对“私有 SSL 证书”的意思?)有点矫枉过正。使用此类证书的更简单方法是:

使用带有证书(或您创建自签名证书的 CA 的证书)的密钥库文件(信任库)并将您的应用程序指向该证书。您所要做的就是确保“SSLContext”知道您的信任库。查看(写得非常好)文章Custom SSL for advanced JSSE developers了解详细信息。从技术上讲,这比使用全局 JRE 信任库更安全,因为只有您的证书才会被接受为有效。

使用“keytool”将证书(或用于创建自签名证书的 CA 的证书)添加到 JRE 的全局信任库。全局 JRE 信任库位于“$JAVA_HOME/lib/security/cacerts”中。 JRE 信任库的密码始终为“changeit”。虽然这种方式显然会使部署更加困难,因为有时您无法控制 JRE 安装。

【讨论】:

  • 请注意,信任库中的证书应标记为trusted。出于完整性考虑,keytool 可能会要求让它信任任何人。哦,恩海:)
  • 我的应用程序的用户几乎无法通过电子邮件附件(这是在 Android 应用程序中)安装这个私有应用程序,更不用说在他们的手机上放置新证书了。我的应用程序非常安全。我真的只需要 JUnit 测试方面的帮助,而不是我在这里的实现方面的帮助。
  • 您可以将信任/密钥库作为应用程序的一部分进行分发(您甚至可以将其嵌入到 JAR 文件中),而不需要用户自己安装证书。虽然它会起作用,但我认为不应该鼓励以你的方式继承“X509TrustManager”。 'X509TrustManager' 实现应用于对证书执行额外检查,例如使用 OCSP 检查其状态。 @owlstead gegroet! :-)
  • IBM 的网站管理员似乎断开了指向“为高级 JSSE 开发人员定制 SSL”的文章的链接。网站管理员和政客一样有用。
  • @jww 他们甚至为自己的支持文档打破了它:www-01.ibm.com/support/docview.wss?uid=swg21191941。我再也找不到原来的文章了。这真的很遗憾,因为它写得很好。
【解决方案2】:

问题是我从junit.framework.TestCase 子类化了我的测试类,这导致我的@BeforeClass 设置方法没有被调用(因此我在那里实例化的变量仍然为空)。删除后,现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多