如何在 Java6 中禁用约束检查(Netscape 证书类型)?

2024-01-08

我正在尝试使用内置类 com.sun.net.httpserver.HttpsServer 在 Java (6) 中构建自定义 HTTPS 服务器。它工作正常,直到我需要客户端身份验证。此时,服务器上的 SSL 调试会失败并出现以下异常。

sun.security.validator.ValidatorException:Netscape 证书类型不允许用于 SSL 客户端

我使用的是我们内部 CA 颁发的证书,该证书用于我们内部的所有应用程序。我检查了证书详细信息,发现类型是“SSL Server”(详细信息如下)。由于我们的政策是对所有内部应用程序使用“SSL 服务器”类型,因此很难更改证书。由于我想为客户端使用服务器证书,因此我不认为这是安全问题。

我正在寻找一种在 Java 中禁用此约束检查的方法。有没有人遇到过这个问题并解决了这个问题?非常感谢任何帮助。

此致, 阿伦

Owner: CN=myapp, OU=mygroup, O=mycompany

Issuer: O=MYCA

Serial number: 4cc8c1da

Valid from: Mon Jan 10 13:46:34 EST 2011 until: Thu Jan 10 14:16:34 EST 2013

Certificate fingerprints:
         MD5:  8C:84:7F:7A:40:23:F1:B5:81:CD:F9:0C:27:16:69:5E
         SHA1: 9B:39:0B:2F:61:83:52:93:D5:58:E5:43:13:7A:8F:E1:FD:AC:98:A4
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:

[1]: ObjectId: 2.5.29.16 Criticality=false
PrivateKeyUsage: [
From: Mon Jan 10 13:46:34 EST 2011, To: Wed Jul 11 21:16:34 EDT 2012]

[2]: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

[3]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: D3 47 35 9B B4 B7 03 18   C6 53 2C B0 FE FD 49 D8  .G5......S,...I.
0010: D0 FB EE 15                                        ....
]
]

[4]: ObjectId: 1.2.840.113533.7.65.0 Criticality=false

[5]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [DistributionPoint:
     [CN=CRL413, O=SWIFT]
]]

[6]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:false
  PathLen: undefined
]

****[7]: ObjectId: 2.16.840.1.113730.1.1 Criticality=false
NetscapeCertType [
   SSL server
]****

[8]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 8F AF 56 BC 80 77 A3 FD   9E D2 89 83 98 FE 98 C7  ..V..w..........
0010: 20 65 23 CC                                         e#.
]

]

您可以包装默认的信任管理器并捕获此特定异常。这将是这样的:

class IgnoreClientUsageTrustManager extends X509TrustManager {
    private final X509TrustManager origTrustManager;
    public class IgnoreClientUsageTrustManager(X509TrustManager origTrustManager) {
        this.origTrustManager = origTrustManager;
    }

    public checkClientTrusted(X509Certificate[] chain, String authType
        throws IllegalArgumentException, CertificateException {
        try {
            this.origTrustManager.checkClientTrusted(chain, authType);
        } catch (ValidatorException e) {
             // Check it's that very exception, otherwise, re-throw.
        }
    }

    // delegate the other methods to the origTrustManager
}        

然后,使用该信任管理器创建一个SSLContext并将其与您的服务器一起使用。

TrustManagerFactory tmf = TrustManagerFactory.getInstance(
    TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore)null);
TrustManager[] trustManagers = tmf.getTrustManagers();

for (int i = 0; i < trustManagers.length; i++) {
    if (trustManagers[i] instanceof X509TrustManager) {
       trustManagers[i] = IgnoreClientUsageTrustManager(trustManagers[i]);
    }
}

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(... you keymanagers ..., trustManagers, null);

您应该从服务器密钥库初始化密钥管理器(正常情况下)。然后您应该能够使用HttpsServer's HttpsConfigurator设置SSLContext(请参阅文档中的示例)。

但这种技术并不理想。

  • 首先,ValidatorException是在一个sun.*不属于公共 API 的包:此代码将特定于 Oracle/OpenJDK JRE。
  • 其次,它依赖于最终实体检查的事实(验证密钥使用扩展)在其余的信任验证之后发生 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/validator/Validator.java#Validator.validate%28java.security.cert.X509Certificate%5b%5d%2Cjava.util.Collection%2Cjava.lang.Object%29(这使得忽略该异常是可以接受的,因为您不会以这种方式忽略其他更基本的检查)。

当然,您可以使用 Java 证书路径 API 重新实现您自己的验证,并仅忽略用于此目的的密钥用法。这需要更多的代码。

更一般地说,如果您想在没有正确扩展名的情况下使用 SSL/TLS 证书作为客户端证书,那么您无论如何都会尝试绕过规范。解决此问题的最佳方法是修改您的 CA 策略,如果它是内部 CA,那么这应该是可行的。服务器证书也设置 TLS 客户端扩展密钥使用是很常见的,即使对于大型 CA 也是如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java6 中禁用约束检查(Netscape 证书类型)? 的相关文章

  • 切换大小写错误。用于 Mac 上 Android 开发的 Eclipse IDE:将工作区合规性更改为 JRE 1.7

    当尝试在 android 项目中使用带有 switch string 的 Switch Case 时 我在 eclipse IDE 中收到错误消息 将工作区合规性更改为 JRE1 7 对于低于 1 7 的源级别 无法打开字符串类型的值 仅允
  • 使用多个窗口通过 Eclipse 进行调试

    我通常运行双显示器设置 因此我为同一工作区打开两个 Eclipse 窗口 显示不同的文件 当我调试并命中断点时 Eclipse 会切换到 调试 透视图 但它还会在我的两个窗口中显示断点所在的文件 行 即使包含断点的文件在一个窗口中打开 但在
  • 如何按出现顺序创建 Java 文档?

    我有一个非常大的 java 类文件 其中有很多成员 如何为此创建 HTML 文档 以便它按出现顺序显示成员 而不按成员类型排序 方法 常量和变量 例如 如果我的 Java 代码是 private int typeOfAction 1 not
  • 无法解析符号“AuthUI”

    我正在添加 firebase google 和 Gmail 登录 但是当我粘贴代码时 onAuthStateChanged NonNull FirebaseAuth firebaseAuth 方法我收到此错误 无法解析符号 AuthUI 在
  • Mockito - 监视真实对象调用原始方法

    想象一下下面的代码 List list List spy spy list doThrow new NullpointerException when spy get 0 doThrow 执行list get 0 这根本没有意义 我想定义模
  • 理解 Spring AOP [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 Spring 3 0 框架 但仍然是新手 谁能通俗地解释一下什么是AOP编程 一个简短的例子肯定会有帮助 Spring 如
  • 导入的项目抛出 java.lang.ClassNotFoundException

    所以我将一个现有的项目导入到 eclipse 中 但让它工作时遇到了很多麻烦 该项目与其他三个图书馆项目一起提供 谷歌播放服务库 捕获活动 肖像二维码 As soon as I imported the project I went und
  • 什么时候数据库被称为嵌入式数据库?

    术语 嵌入式数据库 与 数据库 具有不同的含义吗 我见过的嵌入式数据库有两种定义 嵌入式数据库就像专门为 嵌入式 空间 移动设备等 设计的数据库系统一样 这意味着它们在紧张的环境中 内存 CPU 方面 可以合理地执行 嵌入式数据库就像不需要
  • Spring 3.1 Java配置和内部bean

    Bean public TimedRepository timedRepository RealRepository repo return new TimedRepository repo timer Adds some metrics
  • 如何在 JavaFX 中设置滚动窗格的单位增量?

    The 滚动条 http docs oracle com javafx 2 api javafx scene control ScrollBar htmlJavaFX 中的类包含一个用于设置单位增量的属性 这就是我所追求的 但是我找不到如何
  • hibernate 如何确保二级缓存使用数据库中的最新数据进行更新

    我读到 使用 hibernate 的二级缓存 它可以通过减少数据 对象检索的数据库命中来提高应用程序性能 但是hibernate是如何保证二级缓存与数据库中的数据是最新的呢 例如 假设下面的类是实体并持久化到数据库中 Entity clas
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • 如何生成0-8范围内除一个特定数字之外的随机数?

    我正在尝试开发 Tic Tac Toe 游戏 其中玩家 1 将单击一个按钮放置 X 稍后玩家 2 计算机 将在第一步中随机将 O 放置到其他按钮 为此 我需要创建一个随机数0 8 之间 除了玩家 1 点击的那个之外 我正在使用以下代码来生成
  • 为自定义 userdetailsservice 定义 bean

    我如何定义我的自定义UserDetailsServicebean 的方式使我的 spring mvc Web 应用程序能够使用我的底层 MySQL 数据库来检查用户和密码的身份验证 具体如下 我正在添加安全性spring petclinic
  • 在 Traefik 1.5.0-rc5 中使用新的 httpChallenge 时出现问题

    在尝试升级到最新的 traefik 版本以便能够从 LetsEncrypt 生成 TLS 证书时 我遇到了证书生成时间的问题 这之前工作过traefik 1 4使用acme ondemand标志和其他设置 减去httpChallenge当然
  • Java 8 Streams - 嵌套映射到列表

    firstlist stream map x gt return secondList stream map y gt return a string collect Collectors toList Output I need Get
  • 我们可以向 ServicePointManager.SecurityProtocol 添加四个协议吗?

    我想支持从 ssl3 到 tls 1 2 的所有安全协议 但是在网上搜索时我发现代码为 ServicePointManager SecurityProtocol SecurityProtocolType Ssl3 SecurityProto
  • ACTION_MEDIA_BUTTON 的广播接收器不起作用

    我正在为 Android 操作系统版本 4 0 3 ICS 编写 Android 应用程序 问题是我没有从 BroadcastReceiver 的 onReceive 方法中的 Log d 获得输出 这意味着我的应用程序没有正确处理广播 我
  • 正确检查 FTP 服务器连接

    我在程序开始时打开与 FTP 服务器的连接 在对服务器执行操作之前 我想检查连接是否已成功建立 最简单快速的方式 因此如果连接消失 我将尝试再次连接 我用这段代码来做到这一点 private boolean checkConnection
  • Spring Boot 应用程序崩溃

    请告诉我哪里有问题 我尝试启动我的第一个在 Spring Boot 上开发的应用程序 我已经在 SpringMVC 上有了简单的 Web 项目 现在我喜欢在 BOOT 上构建它 这是错误输出 org springframework bean

随机推荐

  • 自动将 Sybase .ADT 文件转换为 SQL

    我正在处理我获得的一些数据 这些数据是通过使用嵌入式 Advantage 数据库服务器的程序读取的 该程序不是我编写的 并且不具备我需要的所有功能 我想将这些数据转换为不同的格式 以便我可以更自由地使用它 例如 MySQL 我知道Sybas
  • 防止将重复的项目添加到列表框中

    我有这段代码用于添加选定的项目ListBox到另一个 如何防止用户重复添加某个项目 我想要ListBox他们正在添加lstBoxToUserProjects仅包含不同的项目 没有重复的条目 protected void btnAddSele
  • AsyncTask 错误中的 Android JSON

    我正在尝试使用 asynctask 从 google 获取 JSON 数据 但我收到很多错误 我不知道为什么 我是 Android 开发的新手 我对它很感兴趣 然后又退出了 P 然后单击执行异步任务的按钮 new usdjson execu
  • 使用 Yii 自动存储日期时间

    我开始使用 Yii 学习 php 我有一个很大的问题 也许你可以帮助我 我正在使用表单来创建用户 我想将表单中引入的用户数据存储到数据库 MySQL 中 但我还必须将日期和时间存储在数据库的日期时间字段中 我看到一些扩展如 CJUIDATE
  • TYPO3:从 Extbase 中的文件引用中获取路径

    我使用 Fluid 和 Extbase TYPO3 6 1 创建了一个自定义内容元素 您可以在其中定义图片 在图片设置中 我可以设置一个img链接 它的目标是一个文件 在我的控制器中我可以访问这些数据 this gt configurati
  • webkit 中的 CSS3 动画暂停/取消暂停跳过和跳跃

    我已经实现了动画暂停 如下所述 如何使用 JavaScript 暂停和恢复 CSS3 动画 https stackoverflow com questions 5804444 how to pause and resume css3 ani
  • XAML:DataTemplate 中的自定义绑定用于 GridViewColumn CellTemplate

    我希望在整个 GridView 中重用资源中的以下 DataTemplate
  • 如何实现hashCode和equals方法

    我应该如何实施hashCode and equals 对于 Java 中的以下类 class Emp int empid unique across all the departments String name String dept n
  • 高分辨率的响应式字体大小在 MUI 5 中不起作用

    我在用材质 UI v5 https mui com 在我的 React 应用程序中 并使用响应式字体大小 https mui com customization theming responsivefontsizes theme optio
  • Android:findViewById() 方法返回我们不需要转换的值

    因为我厌倦了为每个人编写一个强制转换运算符Activity findViewById 返回原始数据View 我终于尝试了互联网建议的一种方法 http biginteger blogspot jp 2011 04 better findvi
  • C#:Func<> 而不是方法? [复制]

    这个问题在这里已经有答案了 这是一个让大家好奇的问题 使用 Func 而不是方法有什么坏处 缺点吗 简单的例子 private static Func
  • Glide 不接受 GifDrawable 作为目标参数

    我试图用 glide 找出 gif 的结尾 这是我在网上找到的代码 Glide with thisActivity asGif load R raw logo gif motion low listener object RequestLi
  • 在 C# 中搜索子目录

    我有一个文件名列表 我想搜索一个目录及其所有子目录 这些目录每个包含大约 200 000 个文件 我的代码找到该文件 但每个文件大约需要 20 分钟 有人可以建议更好的方法吗 代码片段 String file names File Read
  • 在 Rails 中通过 JS 设计注册#update

    我正在尝试通过 Devise 使用 AJAX 更新用户模型 并让 Devise 使用正确的 javascript 文件进行响应 我想将表单远程提交到 Registrations update 操作 但这不适用于 Devise 的默认响应 它
  • 在 PHP 中初始化(空)数组的最佳方法

    在某些其他语言 例如 AS3 中 已经注意到 如果这样做 初始化新数组会更快var foo 而不是var foo new Array 出于对象创建和实例化的原因 我想知道 PHP 中是否有等价的东西 class Foo private ar
  • 我什么时候应该在 WebGL/OpenGL 中启用/禁用顶点位置属性?

    我正在编写一些 WebGL 代码 该代码具有多个按顺序运行的着色器程序 以前 我使用的是gl enableVertexAttribArray 根据我的 gl 上下文和着色器初始化期间的需要 我假设 也许是错误的 调用此函数是设置特定于由gl
  • 应该最终返回外部并且异常处理是否完美?

    我不应该把这个方法的返回值放在finally中吗 Pylint 给出了这句话的错误 3 return statement in finally block may swallow exception lost exception def s
  • “ez_setup.py”语法错误

    我尝试通过从命令行 64 位 Windows 机器 运行 ez setup py 来安装 easy install 并在以下行中获取 无效语法 except pkg resources VersionConflict e Python版本3
  • Linux 发行版上如何实现非 root 用户的 ping?

    我正在浏览 ping 表单的代码iputils http www skbuff net iputils 适用于 Linux 的包 我注意到ping 使用原始套接字 https sourceforge net p iputils code c
  • 如何在 Java6 中禁用约束检查(Netscape 证书类型)?

    我正在尝试使用内置类 com sun net httpserver HttpsServer 在 Java 6 中构建自定义 HTTPS 服务器 它工作正常 直到我需要客户端身份验证 此时 服务器上的 SSL 调试会失败并出现以下异常 sun