当只有https URL时,获取证书并将其添加到Java信任库?

当只有https URL时,获取证书并将其添加到Java信任库?,java,certificate,google-cloud-messaging,truststore,Java,Certificate,Google Cloud Messaging,Truststore,我正试图通过谷歌云消息服务器向Android设备发送推送通知 我们使用的URL是: https://android.googleapis.com/gcm/send 在我们的Enterprise应用程序中,我们不使用默认的CA权限,并且出于安全原因,我们在SSLContext属性加载的信任库文件中手动添加我们信任的每个实体。 我想将GCM证书添加到我们的信任库中 我不知道如何从该URL获取证书。Chrome/Firefox导出方式似乎不起作用,因为页面重定向到另一个非SSL页面 有人有解决方案吗

我正试图通过谷歌云消息服务器向Android设备发送推送通知

我们使用的URL是:

https://android.googleapis.com/gcm/send
在我们的Enterprise应用程序中,我们不使用默认的CA权限,并且出于安全原因,我们在SSLContext属性加载的信任库文件中手动添加我们信任的每个实体。 我想将GCM证书添加到我们的信任库中

我不知道如何从该URL获取证书。Chrome/Firefox导出方式似乎不起作用,因为页面重定向到另一个非SSL页面


有人有解决方案吗?

如果您有openssl,您可以使用它

openssl s_client -connect android.googleapis.com:443

s_client
是一个“通用SSL/TLS客户端,它使用SSL/TLS连接到远程主机”,它打印出从远程服务器收到的服务器证书。它不是HTTP客户端,因此它不知道如何遵循301重定向,它只会给您连接到的初始服务器的证书。

使用。您可以打开目标密钥存储,然后使用检查>检查SSL/TLS连接,输入
android.googleapis.com
443
,就完成了

我已经能够通过以下Java代码保存证书:

public void testConnectionTo(String aURL) throws Exception {
        URL destinationURL = new URL(aURL);
        HttpsURLConnection conn = (HttpsURLConnection) destinationURL.openConnection();
        conn.connect();
        Certificate[] certs = conn.getServerCertificates();
        System.out.println("nb = " + certs.length);
        int i = 1;
        for (Certificate cert : certs) {
            System.out.println("");
            System.out.println("");
            System.out.println("");
            System.out.println("################################################################");
            System.out.println("");
            System.out.println("");
            System.out.println("");
            System.out.println("Certificate is: " + cert);
            if(cert instanceof X509Certificate) {
                try {
                    ( (X509Certificate) cert).checkValidity();
                    System.out.println("Certificate is active for current date");
                    FileOutputStream os = new FileOutputStream("/home/sebastien/Bureau/myCert"+i);
                    i++;
                    os.write(cert.getEncoded());
                } catch(CertificateExpiredException cee) {
                    System.out.println("Certificate is expired");
                }
            } else {
                System.err.println("Unknown certificate type: " + cert);
            }
        }
    }
并将其导入信任库:

keytool -import -alias GoogleInternetAuthority -file myCert1 -keystore truststore

在我的Linux服务器上,我面临着类似的问题。。如何获取此证书?@mahesh我建议将此问题作为问题而不是注释来提问。只有在您已经在jvm信任库中安装了特定证书时,上述代码才有效。在jvm信任库不知道特定证书的任何其他情况下,conn.connect()抛出javax.net.ssl.SSLHandshakeExceptionFlush并关闭输出流。