当前位置: 首页 > 知识库问答 >
问题:

Java支持让我们加密证书吗?

公孙胡媚
2023-03-14

让我们Encrypt通过IdenTrust交叉签名得到他们的中间,这应该是个好消息。但是,我在这个命令的输出中找不到这两个:

keytool -keystore "..\lib\security\cacerts" -storepass changeit -list

我知道可以在每台机器上手动添加受信任的CA,但由于我的应用程序应该是免费下载和可执行的,不需要任何进一步的配置,所以我正在寻找“开箱即用”的解决方案。你有好消息告诉我吗?

共有1个答案

屠兴旺
2023-03-14

[更新2016-06-08:根据https://bugs.openjdk.Java.net/browse/jdk-8154757,IdenTrust CA将包含在Oracle Java 8U101中。]

[更新2016-08-05:Java 8U101已经发布,并且确实包括IdenTrust CA:发行说明]

Java支持让我们加密证书吗?

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.PKIXParameters;
import java.security.cert.TrustAnchor;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.TrustManagerFactory;

public class SSLExample {
    // BEGIN ------- ADDME
    static {
        try {
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            Path ksPath = Paths.get(System.getProperty("java.home"),
                    "lib", "security", "cacerts");
            keyStore.load(Files.newInputStream(ksPath),
                    "changeit".toCharArray());

            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            try (InputStream caInput = new BufferedInputStream(
                    // this files is shipped with the application
                    SSLExample.class.getResourceAsStream("DSTRootCAX3.der"))) {
                Certificate crt = cf.generateCertificate(caInput);
                System.out.println("Added Cert for " + ((X509Certificate) crt)
                        .getSubjectDN());

                keyStore.setCertificateEntry("DSTRootCAX3", crt);
            }

            if (false) { // enable to see
                System.out.println("Truststore now trusting: ");
                PKIXParameters params = new PKIXParameters(keyStore);
                params.getTrustAnchors().stream()
                        .map(TrustAnchor::getTrustedCert)
                        .map(X509Certificate::getSubjectDN)
                        .forEach(System.out::println);
                System.out.println();
            }

            TrustManagerFactory tmf = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(keyStore);
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), null);
            SSLContext.setDefault(sslContext);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    // END ---------- ADDME

    public static void main(String[] args) throws IOException {
        // signed by default trusted CAs.
        testUrl(new URL("https://google.com"));
        testUrl(new URL("https://www.thawte.com"));

        // signed by letsencrypt
        testUrl(new URL("https://helloworld.letsencrypt.org"));
        // signed by LE's cross-sign CA
        testUrl(new URL("https://letsencrypt.org"));
        // expired
        testUrl(new URL("https://tv.eurosport.com/"));
        // self-signed
        testUrl(new URL("https://www.pcwebshop.co.uk/"));

    }

    static void testUrl(URL url) throws IOException {
        URLConnection connection = url.openConnection();
        try {
            connection.connect();
            System.out.println("Headers of " + url + " => "
                    + connection.getHeaderFields());
        } catch (SSLHandshakeException e) {
            System.out.println("Untrusted: " + url);
        }
    }

}
 类似资料:
  • 我从Let's Encrypt获得了有效的https证书,但将其提供给vert时存在信任问题。x版本3.6.2 我用apache测试了cert,没问题,但是如果我试图用wget到达https vert. x服务器实例,我会得到: $wgethttps://www.myhost.mydomain/json/read/all-languages -2019-01-22 10:30:56--https:

  • 不知道为什么我会得到假证书,即使证书是由我们使用certmanager加密正确颁发的 安装程序在阿里云ECS控制台上运行,其中一个Kube master和一个cube minion组成一个Kubernetes集群。 服务详情 Pod详细信息 已部署舵手证书管理器 正确签发证书 入口详细信息 Letsencrypt Nginx生产定义

  • 在 linkerd Discourse instance 中提出有关配置或故障排除的问题。 在 GitHub issues 中提交 bug 或功能请求。 在我们的 linkerd public Slack 中聊天。 请发送电子邮件至 support@buoyant.io

  • 问题内容: 我们可以在密钥存储区中加载多个证书和密钥吗? 是否总是需要仅加载对(即证书和密钥一起)? 如果密钥库具有多个证书和密钥,那么当Java SSL尝试建立作为服务器的连接时,将选择哪个证书和密钥? 问题答案: 尽管这取决于KeyStore类型,但是通常,您可以在单个存储中存储多个私钥和证书。 基于Java的服务器使用哪种密钥和证书组合取决于应用程序的实现方式。许多应用程序允许您使用 别名

  • 存在两个java api引用: > http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html http://docs.oracle.com/javase/7/docs/technotes/guides/security/certpath/CertPathProgGuide.html 在

  • 为了支持HTTP,我已经将以下代码添加到我的网络应用程序(Spring启动2.5.6v),该应用程序具有HTTPS的SSL证书。 我从上面的代码中可以理解的是,我从外部站点复制粘贴(没有太多解释),每当它收到8080 port(HTTP://localhost:8080)的请求时,它都会将请求重定向到8443 port(HTTPS://localhost:8443)。我不太确定是否也将此代码用于生