无法在 java maven 应用程序中找到请求目标 google recaptcha 的有效证书路径

unable to find valid certification path to requested target google recaptcha in java maven application

我已经用 Google reCaptcha v3 的联系表单制作了一个 Maven 网络应用程序,它是 运行 在 Centos 服务器上的 Glassfish 5 上。联系表单页面向 https://www.google.com/recaptcha/api/siteverify 发出请求并发送令牌和站点密钥。如果请求来自机器人或人类,您将得到一个 json 对象来回答问题。

当 Java 发送该请求时,我收到连接错误:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targe

Java 或 Glassfish 服务器不信任该网站,因为它的密钥库中没有有效证书,如 here 所述。

正在使用 keytool (/opt/jdk1.8.0_181/jre/bin/keytool) 在 /opt/jdk1.8.0_181/[=26= 中导入证书](存储证书的密钥库)不工作。

在 Glassfish 域文件夹中(在我的例子中它在 /home/glassfish/glassfish5/glassfish/domains/domain1 中)有一个配置文件夹,其中包含一个名为 cacerts.jks 和 keystore.jks 的文件。您可以使用 keytool 对其进行编辑,但也可以使用 Keytool Explorer (https://keystore-explorer.org/) 对其进行编辑。 按照说明 her 使用浏览器下载证书。您可以将 SSL 服务器证书下载为 .crt。在我的例子中它是 wwwgooglecom.crt 但你也可以选择你自己的电子邮件服务器(在我的例子中它是 leenheeren.nl.cert。使用上面的 Keystore 工具导入它更容易。上传文件 cacerts.jks 和 keystore.jks 并重新启动 Glassfish 服务器。 cacert.jks 和 keystore.jks 之间的区别如下:cacerts 是 Java 存储(域的)根 CA 的 public 证书的地方。 Java 使用 cacerts 对服务器进行身份验证。 Keystore 是 Java 存储客户端私钥的地方,以便在服务器请求客户端身份验证时可以将其共享给服务器。