我正在尝试使用安全套接字层(HTTPS)在Java中与我的PHP脚本建立连接,但我发现为了确保最大的安全性/有效性,我必须将我的网站使用的SSL证书导入到我的应用程序中……一些我不知道该怎么做的事。
如果有帮助,我的SSL证书不是自签名的,而是由StartSSL提供的,我正在使用Eclipse IDE。
谁能给我指个方向?例如,我需要什么文件,我应该把它们导入到哪里,我需要Java中的什么代码,等等?
发布于 2011-08-28 17:39:06
我发现为了确保最大的安全性/有效性,我必须将网站使用的SSL证书导入到我的应用程序中。
当你说出那句话的时候,你是部分正确的。您不需要导入SSL证书。导入StartSSL CA证书就足够了。
此外,不存在将证书导入到Java应用程序中的问题。Java中的SSL支持依赖于密钥库和信任库的概念,而不是应用程序中打包的某些证书。如果您要发布供最终用户下载和执行的应用程序,则不需要在应用程序中发布证书或私钥。私钥和相关证书将存储在只有您才能访问的密钥库中。
您的应用程序的最终用户将依赖于Java运行时中的SSL支持,这将使应用程序能够在验证服务器证书之后建立到站点的SSL连接。Java运行时在信任库中附带一组默认的CA证书,成功建立SSL连接的唯一先决条件是服务器的SSL证书由信任库中的一个CA颁发。至少从版本6开始,StartSSL的证书不存在于运行时的信任库中,因此:
-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也会有所帮助。
发布于 2015-01-15 09:26:25
下面的方法加载默认的(cacerts)密钥库,检查是否安装了证书,如果没有,则安装它。它消除了在任何服务器上手动运行keystore命令的需要。
它假定默认密钥库密码(changeit)未更改,如果不是,请更新CACERTS_PASSWORD。请注意,该方法在添加证书后保存密钥库,因此在运行一次之后,证书将永久保存在存储区中。
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();
}
}
}像这样使用它:
SslUtil.ensureSslCertIsInKeystore("startssl", new FileInputStream("/path/to/cert.crt"));发布于 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
https://stackoverflow.com/questions/7219989
复制相似问题