![](/img/trans.png)
[英]javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed
[英]Resolving javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Error?
编辑:我试图在我的博客上以更形象的方式格式化问题和接受的答案。
这是原始问题。
我收到此错误:
详细消息 sun.security.validator.ValidatorException:PKIX 路径构建失败:
sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径导致 javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
我使用 Tomcat 6 作为网络服务器。 我有两个 HTTPS web 应用程序安装在不同端口但在同一台机器上的不同 Tomcat 上。 说 App1(端口 8443)和 App2(端口 443)。 App1 连接到 App2。 当 App1 连接到 App2 时,出现上述错误。 我知道这是一个非常常见的错误,因此在不同的论坛和网站上遇到了许多解决方案。 我在两个 Tomcat 的server.xml
中都有以下条目:
keystoreFile="c:/.keystore"
keystorePass="changeit"
每个站点都说 app2 提供的证书不在 app1 jvm 的受信任存储中的相同原因。当我尝试在 IE 浏览器中访问相同的 URL 时,这似乎也是如此,它有效(随着变暖,有一个问题这个web网站的安全证书。这里我说继续这个网站)。 但是当相同的 URL 被 Java 客户端(在我的例子中)击中时,我得到了上述错误。 所以为了把它放在信任库中,我尝试了这三个选项:
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
在环境变量中设置如下
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
在环境变量中设置如下
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
但没有任何效果。
最后起作用的是执行How to handle invalid SSL certificates with Apache HttpClient? 中建议的 Java 方法? 由 Pascal Thivent 即执行程序 InstallCert。
但是这种方法适用于 devbox 设置,但我不能在生产环境中使用它。
我想知道为什么当我通过设置在 App2 服务器的server.xml
和信任库中提到相同的值时,上面提到的三种方法不起作用
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
在 App1 程序中。
有关更多信息,这就是我建立连接的方式:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
您需要将App2的证书添加到位于$JAVA_HOME\lib\security\cacerts
的所用JVM的信任库文件中。
首先,您可以通过运行以下命令检查您的证书是否已经在信任库中: keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
(您不需要提供密码)
如果您的证书丢失,您可以使用浏览器下载它并使用以下命令将其添加到信任库中:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
例子:
keytool -import -noprompt -trustcacerts -alias myFancyAlias -file /path/to/my/cert/myCert.cer -keystore /path/to/my/jdk/jre/lib/security/cacerts/keystore.jks -storepass changeit
导入后,您可以再次运行第一个命令以检查您的证书是否已添加。
可以在此处找到 Sun/Oracle 信息。
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
• 当我收到错误消息时,我尝试用谷歌搜索该表达式的含义,我发现,当服务器更改其 HTTPS SSL 证书时会出现此问题,并且我们的旧版 java 无法识别根证书颁发机构 (CA) .
• 如果您可以在浏览器中访问 HTTPS URL,则可以更新 Java 以识别根 CA。
• 在您的浏览器中,转到Java 无法访问的HTTPS URL。 点击 HTTPS 证书链(Internet Explorer 中有锁图标),点击锁查看证书。
• 转到证书的“详细信息”和“复制到文件”。 以Base64 (.cer)格式复制它。 它将保存在您的桌面上。
• 安装证书忽略所有警报。
• 这就是我收集我试图访问的 URL 的证书信息的方式。
现在我必须让我的 java 版本知道证书,这样它就不会拒绝识别 URL。 在这方面我必须提到,我在 google 上搜索到根证书信息默认保留在 JDK 的\jre\lib\security位置,并且访问的默认密码是: changeit。
要查看 cacerts 信息,请遵循以下步骤:
• 单击开始按钮-->运行
• 键入 cmd。 命令提示符打开(您可能需要以管理员身份打开它)。
• 转到您的Java/jreX/bin
目录
• 键入以下内容
keytool -list -keystore D:\Java\jdk1.5.0_12\jre\lib\security\cacerts
它给出了包含在密钥库中的当前证书的列表。 它看起来像这样:
C:\Documents and Settings\NeelanjanaG>keytool -list -keystore D:\Java\jdk1.5.0_12\jre\lib\security\cacerts
Enter keystore password: changeit
Keystore type: jks
Keystore provider: SUN
Your keystore contains 44 entries
verisignclass3g2ca, Mar 26, 2004, trustedCertEntry,
Certificate fingerprint (MD5): A2:33:9B:4C:74:78:73:D4:6C:E7:C1:F3:8D:CB:5C:E9
entrustclientca, Jan 9, 2003, trustedCertEntry,
Certificate fingerprint (MD5): 0C:41:2F:13:5B:A0:54:F5:96:66:2D:7E:CD:0E:03:F4
thawtepersonalbasicca, Feb 13, 1999, trustedCertEntry,
Certificate fingerprint (MD5): E6:0B:D2:C9:CA:2D:88:DB:1A:71:0E:4B:78:EB:02:41
addtrustclass1ca, May 1, 2006, trustedCertEntry,
Certificate fingerprint (MD5): 1E:42:95:02:33:92:6B:B9:5F:C0:7F:DA:D6:B2:4B:FC
verisignclass2g3ca, Mar 26, 2004, trustedCertEntry,
Certificate fingerprint (MD5): F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6
• 现在我必须将以前安装的证书包含在 cacerts 中。
• 为此,程序如下:
keytool -import -noprompt -trustcacerts -alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD
如果您使用的是 Java 7:
keytool -importcert -trustcacerts -alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit
• 然后它将证书信息添加到 cacert 文件中。
这是我为上述异常找到的解决方案!!
我想在 Tomcat 应用程序中支持自签名证书,但以下代码段无法正常工作
import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HTTPSPlayground {
public static void main(String[] args) throws Exception {
URL url = new URL("https:// ... .com");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
httpURLConnection.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());
String serializedMessage = "{}";
wr.writeBytes(serializedMessage);
wr.flush();
wr.close();
int responseCode = httpURLConnection.getResponseCode();
System.out.println(responseCode);
}
}
这就是解决我的问题的方法:
.crt
文件echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
<your domain>
替换为您的域(例如jossef.com
)cacerts
证书存储中应用.crt
文件keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
<your domain>
替换为您的域(例如jossef.com
)<JAVA HOME>
替换为您的 java 主目录即使我在Java
的默认证书存储中安装了我的证书, Tomcat 也会忽略这一点(似乎它没有配置为使用 Java 的默认证书存储)。
要解决这个问题,请在代码中的某处添加以下内容:
String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
// ...
在我的情况下,问题是网络服务器只发送证书和中间 CA,而不是根 CA。 添加这个 JVM 选项解决了这个问题: -Dcom.sun.security.enableAIAcaIssuers=true
提供对权威信息访问扩展的 caIssuers 访问方法的支持。 出于兼容性考虑,默认情况下禁用它,可以通过将系统属性
com.sun.security.enableAIAcaIssuers
设置为值 true 来启用它。如果设置为 true,则 Sun 的 CertPathBuilder 的 PKIX 实现使用证书的 AIA 扩展中的信息(除了指定的 CertStores)来查找颁发的 CA 证书,前提是它是 ldap、http 或 ftp 类型的 URI。
另一个原因可能是 JDK 版本过时。 我使用的是 jdk 版本 1.8.0_60,只需更新到最新版本即可解决证书问题。
可以通过编程方式禁用 SSL 验证。 适用于开发人员,但不建议用于生产,因为您需要在那里使用“真实”SSL 验证,或者安装并使用您自己的受信任密钥,然后仍然使用“真实”SSL 验证。
下面的代码对我有用:
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class TrustAnyTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
HttpsURLConnection conn = null;
URL url = new URL(serviceUrl);
conn = (HttpsURLConnection) url.openConnection();
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
conn.setHostnameVerifier(allHostsValid);
或者如果您不控制下面的Connection
,您还可以全局覆盖所有连接的 SSL 验证https://stackoverflow.com/a/19542614/32453
如果您使用的是 Apache HTTPClient,则必须“以不同方式”禁用它(可悲): https ://stackoverflow.com/a/2703233/32453
当我遇到同样的问题时,我正在使用jdk1.8.0_171
。 我在这里尝试了前 2 个解决方案(使用 keytool 添加证书和另一个包含 hack 的解决方案),但它们对我不起作用。
我将我的 JDK 升级到1.8.0_181
,它就像一个魅力。
我的 cacerts 文件完全是空的。 我通过将 cacerts 文件从我的 Windows 机器(使用 Oracle Java 7)复制并将其 scp'd 到我的 Linux 机器(OpenJDK)来解决了这个问题。
cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp
然后在linux机器上
cp /tmp/cacerts /etc/ssl/certs/java/cacerts
到目前为止效果很好。
在 Linux 下使用 Tomcat 7,就成功了。
String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
在 Linux 下, $JAVA_HOME
并不总是设置,但通常/etc/alternatives/jre
指向$JAVA_HOME/jre
对我来说,在尝试连接到处理 SSL 的 NGINX 反向代理后面的进程时,也会出现此错误。
事实证明,问题在于没有连接整个证书链的证书。 当我添加中间证书时,问题就解决了。
希望这可以帮助。
可部署的解决方案(Alpine Linux)
为了能够在我们的应用环境中解决这个问题,我们准备了如下的 Linux 终端命令:
cd ~
将在主目录中生成证书文件。
apk add openssl
此命令在 alpine Linux 中安装 openssl。 您可以找到适用于其他 Linux 发行版的正确命令。
openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt
生成所需的证书文件。
sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt
使用程序“keytool”将生成的文件应用到 JRE。
注意:请将您的 DNS 替换为<host-dns-ssl-belongs>
注意2:请注意, -noprompt
不会提示验证信息(是/否),- -storepass changeit
参数将禁用密码提示并提供所需的密码(默认为'changeit')。 这两个属性将允许您在应用程序环境中使用这些脚本,例如构建 Docker 映像。
Note3如果您通过 Docker 部署您的应用程序,您可以生成一次密钥文件并将其放入您的应用程序项目文件中。 您不需要一次又一次地生成它。
我写了一个小的win32(WinXP 32bit testet)愚蠢的cmd(命令行)脚本,它在程序文件中查找所有java版本并向它们添加一个证书。 密码需要是默认的“changeit”或在脚本中自己更改:-)
@echo off
for /F %%d in ('dir /B %ProgramFiles%\java') do (
%ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)
pause
为了安全起见,我们不应该在我们的实现中使用自签名证书。 但是,在开发方面,我们通常必须使用获得自签名证书的试用环境。 我试图在我的代码中以编程方式解决这个问题,但我失败了。 但是,通过将证书添加到 jre 信任库解决了我的问题。 请找到以下步骤,
下载网站证书,
将证书(例如:cert_file.cer)复制到目录 $JAVA_HOME\Jre\Lib\Security
在 Administrator 中打开 CMD 并将目录更改为 $JAVA_HOME\Jre\Lib\Security
使用以下命令将证书导入信任库,
keytool -import -alias ca -file cert_file.cer -keystore cacerts -storepass changeit
如果您收到错误提示 keytool 无法识别,请参考此内容。
像下面这样输入是
信任此证书: [是]
更新
如果您的应用服务器是 jboss,请尝试添加以下系统属性
System.setProperty("org.jboss.security.ignoreHttpsHost","true");
希望这可以帮助!
这似乎是记录臭名昭著的 PKIX 错误消息的另一个可能原因的好地方。 在查看密钥库和信任库内容以及各种 java 安装配置太久之后,我意识到我的问题归结为......一个错字。
错字意味着我也使用密钥库作为信任库。 由于我的公司根 CA 没有被定义为密钥库中的独立证书,而只是作为证书链的一部分,并且没有在其他任何地方定义(即 cacerts),所以我不断收到 PKIX 错误。
在发布失败(这是产品配置,其他地方没问题)和两天的头疼之后,我终于看到了错字,现在一切都很好。
希望这可以帮助某人。
对于 MacOS X,下面是对我有用的确切命令,我不得不在“importcert”选项中尝试使用双连字符,该命令有效:
sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit
对我来说,这篇文章没有得到公认的解决方案: https ://stackoverflow.com/a/9619478/4507034。
相反,我设法通过将证书导入我的机器受信任证书来解决问题。
脚步:
https://localhost:8443/yourpath
)。Manage computer certificates
Trusted Root Certification Authorities
-> Certificates
your_certification_name.cer
文件。我也遇到了这个问题。
通过将 SSL 证书添加到 .keystore,我几乎尝试了所有方法,但是它不适用于 Java1_6_x。 对我来说,如果我们开始使用更新版本的 Java,Java1_8_x 作为 JVM,它会有所帮助。
我想插话,因为我有一个 QEMU 环境,我必须在 Java 中下载文件。 事实证明,QEMU 中的/etc/ssl/certs/java/cacerts
确实存在问题,因为它与主机环境中的/etc/ssl/certs/java/cacerts
不匹配。 主机环境位于公司代理后面,因此 java cacerts 是自定义版本。
如果您使用的是 QEMU 环境,请确保主机系统首先可以访问文件。 例如,您可以先在主机上尝试 此脚本以查看。 如果脚本在主机上运行得很好,但在 QEMU 中却没有,那么你遇到了和我一样的问题。
为了解决这个问题,我只好把QEMU中的原文件备份了,将宿主环境中的文件拷贝到QEMU chroot jail中,然后java就可以在QEMU中正常下载文件了。
更好的解决方案是将/etc
挂载到 QEMU 环境中; 但是我不确定其他文件是否会在此过程中受到影响。 所以我决定使用这个丑陋但简单的解决方法。
我的两分钱:就我而言, cacerts 不是文件夹,而是文件,而且它存在于两个路径上发现它后,将 .jks 文件复制到该文件上后错误消失了。
# locate cacerts
/usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
/usr/java/jre1.8.0_221-amd64/lib/security/cacerts
备份它们后,我将 .jks 复制过来。
cp /path_of_jks_file/file.jks /usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
cp /path_of_jks_file/file.jks /usr/java/jre1.8.0_221-amd64/lib/security/cacerts
注意:这个基本技巧解决了 Genexus 项目上的这个错误,尽管 file.jks 也在 Tomcat 的 server.xml 文件中。
我正在使用颤振并突然收到此错误。 因此,基本上发生的是android/build.gradle
文件中的依赖项中的行,例如:
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
需要证明成绩文件是从 Internet 下载的。 但是当有东西阻止 gradle 下载这些证书时,通常会显示出来。
我尝试导出证书并手动添加它,但它似乎对我不起作用。 在无数次挠头之后,对我有用的是从您的网络偏好中禁用代理。 有人提到禁用 Charles Proxy 会修复它,但在那一刻,我不知道 Charles 是什么以及代理是什么。 在我的情况下,我没有 Charles 代理,所以我继续在 Mac 的网络首选项设置中查找代理(它可以在 Windows 的网络设置中的某处找到)。 我在代理中启用了 Socks。 我禁用了它,然后再次重建了 gradle 和 TA-DAH !!! 它工作黄油光滑。
有几件事要记住。 如果您在禁用代理后立即构建项目而不关闭网络首选项选项卡,则禁用代理将不起作用,并且会显示相同的错误。 此外,如果您已经构建了项目并且在禁用代理后再次运行它,那么它很可能会显示相同的错误(可能是由于 IDE 缓存)。 它对我的工作原理:重新启动 Mac,在浏览器中打开几个选项卡(用于一些网络调用),从系统首选项>> wifi 中检查网络首选项并禁用代理,关闭系统首选项应用程序,然后构建项目。
对于在 Ubuntu 服务器上运行的 Tomcat,要找出正在使用的 Java,请使用“ps -ef | grep tomcat”命令:
样本:
/home/mcp01$ **ps -ef |grep tomcat**
tomcat7 28477 1 0 10:59 ? 00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005 28567 28131 0 11:34 pts/1 00:00:00 grep --color=auto tomcat
然后,我们可以进入: cd /usr/local/java/jdk1.7.0_15/jre/lib/security
默认cacerts文件位于此处。 将不受信任的证书插入其中。
我使用AndroidStudio
, Charles Proxy
, JUnit
和Robolectric
遇到了这个问题。 谢谢@SimonSez,我可以解决这个问题。
请注意:由于关键是修改cacerts
会导致一些问题(例如, 更新IDE ),所以我建议您将原始cacerts
文件复制到单独的目录中,并在需要时进行操作。
%JAVA_HOME%
-Android使用其他JavaHome。 您可以在UnitTests resulr
标签中找到完整路径。 就我而言,它是/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home
下载查尔斯证书(例如, Downloads
文件夹)
运行命令
sudo keytool -import -noprompt -trustcacerts -alias charles -file <path to Charles certificate.pem> -keystore "JAVA_HOME/jre/lib/security/cacerts" -storepass changeit
例如
sudo keytool -import -noprompt -trustcacerts -alias charles -file ~/Downloads/charles-ssl-proxying-certificate.pem -keystore "/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts" -storepass changeit
我从在 AWS EC2 中运行的应用服务器进行 REST 调用时遇到了这个问题。 以下步骤为我解决了这个问题。
curl -vs https://your_rest_path 现在可以工作了!
我在 Apache Tomcat/7.0.67 和 Java JVM Version: 1.8.0_66-b18 上也有同样的问题。 随着将 Java 升级到 JRE 1.8.0_241,问题似乎得到了解决。
如果您使用的是 JDK 11,则该文件夹中不再包含 JRE。 证书的位置是 jdk-11.0.11/lib/security/cacerts。
对于 OkHttpClient,这个解决方案对我有用。 它可能会帮助使用图书馆的人......
try {
String proxyHost = "proxy_host";
String proxyUsername = "proxy_username";
String proxyPassword = "proxy_password";
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, "port goes here"));
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient client = new OkHttpClient().newBuilder()
.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
.hostnameVerifier((hostname, session) -> true)
.connectTimeout(timeout, TimeUnit.SECONDS)
.proxy(proxy)
.proxyAuthenticator((route, response) -> {
String credential = Credentials.basic(proxyUsername, proxyPassword);
return response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build();
})
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody requestBody = RequestBody.create(payload, mediaType);
Request request = new Request.Builder()
.url(url)
.header("Authorization", "authorization data goes here")
.method(requestMethod, requestBody)
.build();
Response response = client.newCall(request).execute();
resBody = response.body().string();
int responseCode = response.code();
} catch (Exception ex) {
}
查看各种证书内容以及通过标准 openssl 程序生成的内容,我注意到为 openssl 根证书设置了 AutorityKeyIdentifier 自身。 可能有办法克服它......但我不知道......
然后我用 Java11 和 BouncyCastle 开发了一个小应用程序来生成根证书和密钥,现在在 github 上: https ://github.com/kendarorg/JavaCaCertGenerator
使用此工具生成的根证书不包含 AuthorityKeyIdentifier,并且可以使用 keytool 直接安装在 cacert 存储中。 当我创建 csr 和带有域名的 ext 文件时,这将针对包含根的 cacert 存储进行验证.. 并且没有更多的握手异常!
可能是cacert不允许递归AuthorityKeyIdentifier? 我不知道,但我会感谢一些评论:)
我在 Android Studio 中遇到了这个错误。 所以我经过大量研究后做到了这一点。
cacert的密码是changeit
第 1 步:以管理员身份打开 CMD
第 2 步:输入“Powershell”
第 3 步:启动进程 powershell -verb runas
第 4 步:将您的所有证书添加到 C:\Program Files\Android\Android Studio\jre\lib\security 这个 cacert 可用的位置。
第 5 步:转到 Keytool 目录 Set-Location -Path "C:\Program Files\Android\Android Studio\jre\bin"
第 6 步:在 powershell 中运行此命令 .\keytool -importcert -trustcacerts -alias GiveNameforyourcertificate -file "C:\Program Files\Android\Android Studio\jre\lib\security\Replace With Your Certificate name.cer" -keystore cacerts
第 7 步:如果添加证书时出现错误(拒绝访问),则创建 D 驱动器分区( https://www.diskpart.com/windows-10/how-to-create-d-drive-from-c-drive- in-windows-10-0725.html )或将您的文件移动到 d 驱动器然后添加证书
如果您将文件保存在 D 驱动器中,则仅执行此操作
第 8 步:keytool -importcert -trustcacerts -alias Nameyourcertificate -file "D:\Certificatename.cer" -keystore cacerts
第 9 步:使用此命令检查是否添加了证书。\keytool -list -keystore cacerts
我们也有同样的问题,我们做了以下所有事情。
最后我们的weblogic启用了weblogic DEBUG模式,发现有“NOT HANDSHAKED”异常。
我们发现的原因是,客户端系统使用的是 jdk 1.6,而服务器使用的是更高版本的 jdk (1.8),因此存在一些 TLS 版本不匹配导致的问题。
Weblogic 团队通过在服务器 arguments 中添加以下行来调整服务器配置。
“-Djdk.tls.client.protocol=TLSv1.2 -DUseSunHttpHandler=true。”
当我在代理后面时,我遇到了 Android Studio 的这个问题。 我正在使用 Crashlytics 尝试在构建期间上传映射文件。
我将缺少的代理证书添加到位于/Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts
的信任库
使用以下命令: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]
例如使用默认信任库密码keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt
只是一个小技巧。 将文件“hudson.model.UpdateCenter.xml”中的 URL 从 https 更新为 http
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://updates.jenkins.io/update-center.json</url>
</site>
</sites>
留意@NDeveloper 的精彩答案。 我当然做了复制粘贴,改变了价值观,我得到了
Illegal option: ?import
我确实检查了连字符,我看到那个答案是使用 ASCII 的连字符
– 8211
如果您遇到问题,请检查对我有用的 ASCII 代码是否是此代码 = 45
- 45
我的代码
keytool -import -noprompt -trustcacerts -alias Certificado -file "C:\Users\JavIut\Desktop\Company\Certificados\Certificado.cer" -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts"
在紧要关头,您可以完全禁用 SSL,或按连接禁用(注意不建议将其用于生产!)请参阅https://stackoverflow.com/a/19542614/32453
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.