SSL 证书验证:javax.net.ssl.SSLHandshakeException

2023-11-27

我正在尝试通过调用 HTTPS REST APIJersey Client。在开发过程中我偶然发现以下错误:

Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
    at com.sun.jersey.api.client.Client.handle(Client.java:648)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503)
    at com.lftechnology.sbworkbench.utility.utils.PingFederateUtility.main(PingFederateUtility.java:32)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found

所以我用谷歌搜索了一下,发现了很多解决方案,这确实有效。

  1. 使用 Jersey 客户端的 HTTPS
  2. https://gist.github.com/outbounder/1069465
  3. 如何修复“java.security.cert.CertificateException:不存在主题备用名称”错误?
  4. http://www.mkyong.com/webservices/jax-ws/java-security-cert-certificateexception-no-name-matching-localhost-found/
  5. http://java.globinch.com/enterprise-java/security/fix-java-security-certificate-exception-no-matching-localhost-found/

他们处于不同的领域,但他们有一个共同的解决方案来解决这个问题。

Scenario

我目前在开发环境中使用自行创建的自签名证书。因此,它必然会出现这个问题。

Question

上述解决方案侧重于跳过/允许验证所有证书。

但是当我将其移动到生产环境时,我就可以从可信来源访问有效签名证书。

  1. 那么当我转向生产时这些解决方案有什么帮助吗?
  2. 可以跳过 SSL 验证吗?
  3. 实现通用解决方案的其他替代方法是什么 开发环境和生产环境?

P.S

我使用的解决方案是,

try
{
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(X509Certificate[] certs, String authType) {
        }
        public void checkServerTrusted(X509Certificate[] certs, String authType) {
        }
    }
    };

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (KeyManagementException e) {
    e.printStackTrace();
}

然后我与之合作Jersey使其发挥作用。而且效果很好。

所以Question again. 该解决方案是否可以在生产环境中使用?但是,您不想修改返回的实体,最好以只读模式获取实体。这将允许 Hibernate 丢弃关联的分离状态,脏检查机制使用该状态来检测实体状态修改。此外,在刷新期间会跳过只读实体。


我目前正在使用自行创建的自签名证书 开发环境。 ... javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException:没有名称匹配 找到 dev.ppc.lftechnology.com

自签名证书似乎不正确。

下面是OpenSSLCONF我用来创建在测试期间使用的自签名证书和证书请求的文件。另存为example-com.conf。更改下面的 DNS 名称[ alternate_names ]以满足您的口味。你甚至可以把localhost, localhost.localdomain and 127.0.0.1在那里进行测试。

如果您想创建自签名证书,请使用:

openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
    -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem

如果您想创建由受信任的机构签名的签名请求 (CSR),请使用:

openssl req -config example-com.conf -new -newkey rsa:2048 \
    -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem

自签名证书和签名请求之间的区别在于-x509选项。和-x509现在,自签名证书已创建。的缺席-x509表示创建了一个请求。

如果您想打印自签名证书或请求查看其中的实际内容,请使用:

openssl x509 -in example-com.cert.pem -text -noout
openssl req -in example-com.req.pem -text -noout

如果你想测试服务器,那么使用s_client:

openssl s_client -connect <server>:<port> -CAfile <trust-anchor.pem>

上述命令应以类似以下内容的消息结束Verify OK (0)。如果您没有收到Verify OK (0),然后修复您的测试设备。一旦 OpenSSL 成功完成,那么这将成为您的基线。


[ req ]
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_extensions
x509_extensions     = cert_extensions
string_mask         = utf8only

[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = NY

localityName            = Locality Name (eg, city)
localityName_default        = New York

organizationName         = Organization Name (eg, company)
organizationName_default    = Example, LLC

# Use a friendly name here. Its presented to the user.
#   The server's DNS name show up in Subject Alternate Names. Plus, 
#   DNS names here is deprecated by both IETF and CA/Browser Forums.
commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Example Company

emailAddress            = Email Address
emailAddress_default        = [email protected]

[ cert_extensions ]

subjectKeyIdentifier        = hash
authorityKeyIdentifier  = keyid,issuer

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
# extendedKeyUsage  = serverAuth
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

[ req_extensions ]

subjectKeyIdentifier        = hash

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
# extendedKeyUsage  = serverAuth
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

可以跳过 SSL 验证吗?

不,这是非常不负责任的。如果您不打算正确使用 PKIX,那为什么还要使用它呢?

我想到了这一点:世界上最危险的代码:在非浏览器软件中验证 SSL 证书.


HostnameVerifier allHostsValid = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};

最好将您的自签名证书加载到密钥库中(或加载您的私有 CA),然后将其传递给SSLContext.init。然后一切都会按预期进行,无需信任一切或返回true from verify.

Bruno 和 EJP 对于这个主题有很多答案。


为开发和生产环境实现通用解决方案的其他替代方法是什么?

使用格式良好的证书来链接回受信任的根。

为了进行测试,您可以创建自签名证书。或者,创建一个证书请求并由您的内部 CA 在私有 PKI 中对其进行签名。在这种情况下,您需要信任您的自签名证书或信任您的内部 CA。

对于生产,您可以使用由 CA Zoo 成员之一签名的证书,以便组织外部的其他人也信任它。StartCom and CACert提供免费的 1 级证书。

1 类证书通常经过域验证,并且不允许使用通配符。虽然 Class 1 是免费发行的,但他们会对撤销收取费用,因为这就是成本所在。

如果您需要外卡,那么您通常会购买 2 级或更高级别的卡。

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

SSL 证书验证:javax.net.ssl.SSLHandshakeException 的相关文章

  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • Java:从集合中获取第一项

    如果我有一个集合 例如Collection
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • Spring Data JPA:查询如何返回非实体对象或对象列表?

    我在我的项目中使用 Spring Data JPA 我正在演奏数百万张唱片 我有一个要求 我必须获取各种表的数据并构建一个对象 然后将其绘制在 UI 上 现在如何实现我的 Spring 数据存储库 我读到它可以通过命名本机查询来实现 如果指
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 无法访问 GitLab:SSL 证书已过期

    在 Visual Studio 中 我尝试从 GitLab 上的存储库中提取一些更改 但它给了我一个错误 Git 因致命错误而失败 无法访问https gitlab git SSL证书问题 证书已过期 如何生成新证书并将其添加到 VS 中

随机推荐

  • iOS 使 UIImage 的一部分透明

    我有一个 UIImage 其中一部分已被用户选择清除 使其透明 为了进行选择 我使用了 NSBezierPath 如何在 iOS 中清除 使 UIImage 的部分透明 首先 我假设您有 UIBezierPath iOS 而不是 NSBez
  • PHP cURL HTTP 代码返回 0

    我不明白 当我 echo httpCode 时 我总是得到 0 当我将 html brand 更改为损坏的网址时 我期待 404 有什么我想念或不知道的吗 谢谢 check if url exist ch curl init curl se
  • 如何重新构建默认的“Launcher”应用程序?

    我的目标是修改Launcher应用程序并动态修改和更改主题 我在以下位置看到了几个 家庭 应用程序http www cyrket com p android com stain46 taghome 看来他们采用了默认的主页 启动器 并对其进
  • printf 中用星号填充?

    我已经搜索了高低 但在 C 中的 printf 中 似乎只有零填充和空白填充 我正在寻找自己的填充 在本例中使用星号 例如 假设宽度为8个字符 Input 123 Ouput 123 00 Input 3输出 3 00 我怎样才能做到这一点
  • Bash 中的嵌套函数调用

    现在 我正在尝试将一个 bash 函数调用嵌套在另一个函数调用中 以便一个函数的输出用作另一个函数的输入 是否可以像我在这里尝试那样在 bash 中嵌套函数调用 首先 我定义了这两个函数 returnSomething return 5 f
  • 使用ggplot2过度绘制分组箱线图中的平均点

    我有一个像这样的 ggplot2 分组箱线图 p lt qplot factor cyl mpg data mtcars geom boxplot fill factor gear 我想透支平均点 我试过这个 p stat summary
  • 如何在 iOS 中使用 3D 纹理?

    我找不到glTexImage3D OpenGL ES 2 0 中的 OpenGL 函数 那么如何使用 3D 纹理 例如 tga 文件 有人知道如何在 OpenGL ES 2 0 中使用 3D 纹理吗 OpenGL ES 1 x 和 2 x
  • 替换列表列表中的字符串

    我有一个字符串列表列表 例如 example string 1 a r ntest string string 1 test 2 another r ntest string 我想更换 r n 有一个空格 并去掉 在所有字符串的末尾 对于普
  • Haskell 库导入语法

    对于这个非常基本的问题抱歉 在 GHCi 中 两者之间有区别吗 import Library Name and m Library Name 它们看起来是等效的 但我认为使用替代语法是有原因的 你说得对import Module and m
  • 使用 XPath 和变量解析 lxml.html

    我有这个 HTML 片段 div h3 class toggle Table of Contents h3 div ul class toc li class level1 div class li a href section a div
  • JSP页面应该如何检查身份验证

    我是网络编程新手 我要求一种通用模式来执行诸如检查身份验证之类的操作 这是场景 该网站有一个供访问者登录的页面 它将获取用户名和加密密码并将其发送到服务器 然后从服务器获取错误代码 用户名 密码不匹配 或身份验证密钥 当用户登录成功时 我希
  • 当原始存储库不可用时,是否可以将默认存储库添加到 SLES?

    我有一个由不可用的人安装的 SLES 服务器 我查过 etc zypp repos d 有一个repo文件SUSE Linux Enterprise Server 11 SP4 11 4 4 1 109 repo 其内容是 SUSE Lin
  • Drive API 的 Google API OAuth 无法正常工作。出现错误:origin_mismatch

    我正在尝试运行 Google Drive 实时 API 的快速启动代码 我相信我做的一切都是对的 但我越来越 Error origin mismatch Request Details openid connect request true
  • 如何在 Mac OS X 上安装 libffi-dev

    我正在尝试在unix上实现micropython 这需要libffi dev 我是这样安装的brew install libffi dev 但好像没有找到libffi dev 有什么方法可以安装吗libffi dev在 Mac 操作系统上
  • 如何识别唯一用户?

    Question 如何确定用户是否是唯一的 我知道有很多方法可以使用 cookie 来执行此操作 但是不使用 cookie 的方法又如何呢 例如 转到城市词典并单击向上 向下投票按钮之一 即使您删除 cookie 并返回该页面 您也将无法对
  • ANTLRv4:非贪婪规则

    我正在阅读明确的 ANTLR4 参考文献 并对其中一个示例有疑问 第 76 页 STRING ESC fragment ESC 该规则与典型的 C 字符串匹配 包含在 其中可以包含 too 在我的预期中 规则STRING由于非贪婪构造 应该
  • 如何在 Mac OS X 上的 NSTextField 中启用拼写检查?

    我有一个 NSTextField 我想启用 键入时 拼写检查 当我加载应用程序时 我可以通过菜单栏 gt 编辑 gt 拼写和语法 gt 键入时检查拼写来执行此操作 我希望默认启用此选项 在 IB 中 我可以为 NSTextView 启用此功
  • Android AutoCompleteTextView 与自定义适配器过滤不起作用

    我有自定义 CustomerAdapter public class CustomerAdapter extends ArrayAdapter
  • 当关闭挂钩坏掉时

    如果我添加一个关闭钩子我的 Java 程序的运行时如下所示 public class MyShutdownHook implements Runnable Override public void run Stuff I want exec
  • SSL 证书验证:javax.net.ssl.SSLHandshakeException

    我正在尝试通过调用 HTTPS REST APIJersey Client 在开发过程中我偶然发现以下错误 Exception in thread main com sun jersey api client ClientHandlerEx