首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和SSL证书

问Java和SSL证书
EN

Stack Overflow用户
提问于 2011-08-28 17:06:37
回答 6查看 68.2K关注 0票数 16

我正在尝试使用安全套接字层(HTTPS)在Java中与我的PHP脚本建立连接,但我发现为了确保最大的安全性/有效性,我必须将我的网站使用的SSL证书导入到我的应用程序中……一些我不知道该怎么做的事。

如果有帮助,我的SSL证书不是自签名的,而是由StartSSL提供的,我正在使用Eclipse IDE。

谁能给我指个方向?例如,我需要什么文件,我应该把它们导入到哪里,我需要Java中的什么代码,等等?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-28 17:39:06

我发现为了确保最大的安全性/有效性,我必须将网站使用的SSL证书导入到我的应用程序中。

当你说出那句话的时候,你是部分正确的。您不需要导入SSL证书。导入StartSSL CA证书就足够了。

此外,不存在将证书导入到Java应用程序中的问题。Java中的SSL支持依赖于密钥库和信任库的概念,而不是应用程序中打包的某些证书。如果您要发布供最终用户下载和执行的应用程序,则不需要在应用程序中发布证书或私钥。私钥和相关证书将存储在只有您才能访问的密钥库中。

您的应用程序的最终用户将依赖于Java运行时中的SSL支持,这将使应用程序能够在验证服务器证书之后建立到站点的SSL连接。Java运行时在信任库中附带一组默认的CA证书,成功建立SSL连接的唯一先决条件是服务器的SSL证书由信任库中的一个CA颁发。至少从版本6开始,StartSSL的证书不存在于运行时的信任库中,因此:

  • 您可以指示您的最终用户执行将StartSSL CA证书导入到信任库的活动。可能有帮助的链接包括this StartSSL forum thread (只需要前4个步骤就可以将CA证书导入信任库)、a GitHub project和this blog post;免责声明-我没有尝试使用其中任何一个,您应该自担风险使用它。
    • 或者,您可以使用您自己的信任库使用SSL启动标志来初始化您的应用程序,或者在初始化-Djavax.net.ssl.trustStore=<path_to_truststore> -Djavax.net.ssl.trustStorePassword=<truststore_password>连接之前执行以下代码:

System.setProperty("javax.net.ssl.trustStore","");System.setProperty("javax.net.ssl.trustStorePassword","");

只有当您的应用程序是Java应用程序,而不是applet (或者对如何指定信任库有类似限制的应用程序)时,这才是可行的方法。

阅读Java keytool documentation也会有所帮助。

票数 31
EN

Stack Overflow用户

发布于 2015-01-15 09:26:25

下面的方法加载默认的(cacerts)密钥库,检查是否安装了证书,如果没有,则安装它。它消除了在任何服务器上手动运行keystore命令的需要。

它假定默认密钥库密码(changeit)未更改,如果不是,请更新CACERTS_PASSWORD。请注意,该方法在添加证书后保存密钥库,因此在运行一次之后,证书将永久保存在存储区中。

代码语言:javascript
复制
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;

/**
 * Add a certificate to the cacerts keystore if it's not already included
 */
public class SslUtil {
    private static final String CACERTS_PATH = "/lib/security/cacerts";

    // NOTE: DO NOT STORE PASSWORDS IN PLAIN TEXT CODE, LOAD AT RUNTIME FROM A SECURE CONFIG
    // DEFAULT CACERTS PASSWORD IS PROVIDED HERE AS A QUICK, NOT-FOR-PRODUCTION WORKING EXAMPLE
    // ALSO, CHANGE THE DEFAULT CACERTS PASSWORD, AS IT IMPLORES YOU TO!
    private static final String CACERTS_PASSWORD = "changeit";

    /**
     * Add a certificate to the cacerts keystore if it's not already included
     * 
     * @param alias The alias for the certificate, if added
     * @param certInputStream The certificate input stream
     * @throws KeyStoreException
     * @throws NoSuchAlgorithmException
     * @throws CertificateException
     * @throws IOException
     */
    public static void ensureSslCertIsInKeystore(String alias, InputStream certInputStream)
            throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException{
        //get default cacerts file
        final File cacertsFile = new File(System.getProperty("java.home") + CACERTS_PATH);
        if (!cacertsFile.exists()) {
            throw new FileNotFoundException(cacertsFile.getAbsolutePath());
        }

        //load cacerts keystore
        FileInputStream cacertsIs = new FileInputStream(cacertsFile);
        final KeyStore cacerts = KeyStore.getInstance(KeyStore.getDefaultType());
        cacerts.load(cacertsIs, CACERTS_PASSWORD.toCharArray());
        cacertsIs.close();

        //load certificate from input stream
        final CertificateFactory cf = CertificateFactory.getInstance("X.509");
        final Certificate cert = cf.generateCertificate(certInputStream);
        certInputStream.close();

        //check if cacerts contains the certificate
        if (cacerts.getCertificateAlias(cert) == null) {
            //cacerts doesn't contain the certificate, add it
            cacerts.setCertificateEntry(alias, cert);
            //write the updated cacerts keystore
            FileOutputStream cacertsOs = new FileOutputStream(cacertsFile);
            cacerts.store(cacertsOs, CACERTS_PASSWORD.toCharArray());
            cacertsOs.close();
        }
    }
}

像这样使用它:

代码语言:javascript
复制
SslUtil.ensureSslCertIsInKeystore("startssl", new FileInputStream("/path/to/cert.crt"));
票数 3
EN

Stack Overflow用户

发布于 2018-01-25 09:27:05

显然,出于某种原因,邮件枪工程师不想给我们明确的指示,告诉我们如何解决这个问题。我就是这么做的

我们运行tomcat8并通过jersey web服务连接到mailgun。我遵循了这个用户的说明,它工作得很好。希望这对某些人有帮助。

在1/22,由于Symantec的PKI基础设施设置为不受信任,我们更新了SSL证书。一些旧版本的Java没有"DigiCert全局根G2“CA。

有几个选项:

将“cacerts全局根G2”CA导入到"cacerts“文件中。将您的JRE升级到8u91 (或更高版本),其中包含此根目录。要导入"DigiCert全局根目录G2“,可以从https://www.digicert.com/digicert-root-certificates.htm下载根目录。确保下载的是正确的根证书。

下载证书后,您需要使用如下命令将其导入:

keytool -import -trustcacerts -keystore / path / to /cacerts -storepass changeit -noprompt -alias digicert-global- root -g2 -file /path/ to /digicert.crt您需要设置您的Java Keystore的路径和您下载的根证书的位置。

因此,1. /path/to/digicert.crt就是您刚刚下载的文件。2. / path /to/cacerts -这位于您的JRE路径中。I "find / -name cacerts -print“这将帮助您快速找到文件系统上的所有java cacerts。对我来说,它是/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/security/cacerts

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7219989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档