带有小程序和自签名服务器证书的HTTPS连接上的Java弹出窗口

带有小程序和自签名服务器证书的HTTPS连接上的Java弹出窗口,java,ssl,https,applet,Java,Ssl,Https,Applet,我有一个在1.6中编译的签名小程序(兼容1.5),可以让一些HTTPS获得连接。 服务器上的HTTPS证书是自签名的,但小程序嵌入了一个.pem文件,其中包含允许验证证书链的根证书。 小程序使用有效的商业证书签名 在我的单元测试中,HTTPS连接没有任何问题。 如果没有此项,则会出现预期的连接错误。pem导入: javax.net.ssl.SSLHandshakeException - sun.security.validator.ValidatorException: PKIX path bu

我有一个在1.6中编译的签名小程序(兼容1.5),可以让一些HTTPS获得连接。
服务器上的HTTPS证书是自签名的,但小程序嵌入了一个.pem文件,其中包含允许验证证书链的根证书。
小程序使用有效的商业证书签名

在我的单元测试中,HTTPS连接没有任何问题。
如果没有此项,则会出现预期的连接错误。pem导入:

javax.net.ssl.SSLHandshakeException - sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

但是当我在我的网站中使用小程序时,当HTTPS连接完成时,会弹出以下安全警告:

无论我单击Continue还是Cancel,HTTPS连接都不会出现任何问题,并且此警告不再显示

有没有办法删除这个无用的弹出窗口?
在我的MANIFEST.MF中,我添加了:

Trusted-Library: true
我也测试了这个,没有任何变化:

Trusted-Only: true
Permissions: all-permissions

我的java代码是对以下代码的稍微修改版本:




解决方法(2013年9月30日) 如果通过Java控制面板添加.pem,则在安全站点CA中,不再有Java弹出窗口

因此,解决方法是以编程方式将.pem添加到此密钥存储(jsse cacerts)。
我修改了函数getSocketFactoryFromPEM的代码,以便将密钥库存储在正确的位置:

private SSLSocketFactory getSocketFactoryFromPEM(InputStream pemStream) throws Exception
{
    byte[] certAndKey = streamToBytes(pemStream);
    byte[] certBytes = parseDERFromPEM(certAndKey, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----");
    X509Certificate cert = generateCertificateFromDER(certBytes);

    KeyStore keystore = KeyStore.getInstance("JKS");

    String userHome = System.getProperty("user.home");
    String certPath = userHome + File.separator;
    int os = getOperatingSystem();
    switch (os)
    {
        case WINDOWS:
            //  <User Application Data Folder>\LocalLow\Sun\Java\Deployment\security\trusted.jssecacerts
            certPath += "AppData" + File.separator + "LocalLow" + File.separator + "Sun" + File.separator + "Java" + File.separator + "Deployment";
            break;
        case MAC:
            // ~/Library/Application Support/Oracle/Java/Deployment/security/trusted.jssecacerts
            certPath += "Library" + File.separator + "Application Support" + File.separator + "Oracle" + File.separator + "Java" + File.separator + "Deployment";
            break;
        case LINUX:
            // ${user.home}/.java/deployment/security/trusted.jssecacerts
            certPath += ".java" + File.separator + "deployment";
            break;
        default:
            break;
    }
    certPath += File.separator + "security" + File.separator + "trusted.jssecacerts";

    File certInputFile = new File(certPath);
    FileInputStream certInputStream = null;
    if (certInputFile.canRead())
    {
        certInputStream = new FileInputStream(certInputFile);
        keystore.load(certInputStream, null);
    }
    else
    {
        keystore.load(null);
    }

    keystore.setCertificateEntry("cert-alias", cert);

    FileOutputStream certOutputFile = new FileOutputStream(certInputFile);
    keystore.store(certOutputFile, "".toCharArray());
    certOutputFile.close();

    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keystore);
    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, tmf.getTrustManagers(), null);
    return context.getSocketFactory();
}
私有SSLSocketFactory getSocketFactoryFromPEM(InputStream pemStream)引发异常
{
字节[]certAndKey=streamToBytes(pemStream);
byte[]certBytes=parseDERFromPEM(certAndKey,“----开始证书----”,“----结束证书----”;
X509Certificate cert=generateCertificateFromDER(certBytes);
KeyStore KeyStore=KeyStore.getInstance(“JKS”);
字符串userHome=System.getProperty(“user.home”);
字符串certPath=userHome+File.separator;
int os=getOperatingSystem();
交换机(os)
{
案例窗口:
//\LocalLow\Sun\Java\Deployment\security\trusted.jssecacerts
certPath+=“AppData”+File.separator+“LocalLow”+File.separator+“Sun”+File.separator+“Java”+File.separator+“部署”;
打破
案例MAC:
//~/Library/Application Support/Oracle/Java/Deployment/security/trusted.jssecacerts
certPath+=“Library”+File.separator+“应用程序支持”+File.separator+“Oracle”+File.separator+“Java”+File.separator+“部署”;
打破
案例LINUX:
//${user.home}/.java/deployment/security/trusted.jssecacerts
certPath+=“.java”+File.separator+“部署”;
打破
违约:
打破
}
certPath+=File.separator+“security”+File.separator+“trusted.jssecacerts”;
文件certInputFile=新文件(certPath);
FileInputStream certInputStream=null;
if(certInputFile.canRead())
{
certInputStream=新文件输入流(certInputFile);
load(certInputStream,null);
}
其他的
{
keystore.load(null);
}
setCertificateEntry(“证书别名”,cert);
FileOutputStream certOutputFile=新的FileOutputStream(certInputFile);
keystore.store(certOutputFile,“.”.toCharArray());
certOutputFile.close();
TrustManagerFactory tmf=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(密钥库);
SSLContext context=SSLContext.getInstance(“TLS”);
context.init(null,tmf.getTrustManagers(),null);
返回context.getSocketFactory();
}

FYI,我找到了一个解决方法!更多信息在我原来的帖子末尾。我注意到,如果通过Java控制面板在安全站点CA中添加.pem,那么就不会有更多的Java弹出窗口。然后,解决方法是以编程方式将.pem添加到此密钥存储(jsse cacerts)
private SSLSocketFactory getSocketFactoryFromPEM(InputStream pemStream) throws Exception
{
    byte[] certAndKey = streamToBytes(pemStream);
    byte[] certBytes = parseDERFromPEM(certAndKey, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----");
    X509Certificate cert = generateCertificateFromDER(certBytes);

    KeyStore keystore = KeyStore.getInstance("JKS");

    String userHome = System.getProperty("user.home");
    String certPath = userHome + File.separator;
    int os = getOperatingSystem();
    switch (os)
    {
        case WINDOWS:
            //  <User Application Data Folder>\LocalLow\Sun\Java\Deployment\security\trusted.jssecacerts
            certPath += "AppData" + File.separator + "LocalLow" + File.separator + "Sun" + File.separator + "Java" + File.separator + "Deployment";
            break;
        case MAC:
            // ~/Library/Application Support/Oracle/Java/Deployment/security/trusted.jssecacerts
            certPath += "Library" + File.separator + "Application Support" + File.separator + "Oracle" + File.separator + "Java" + File.separator + "Deployment";
            break;
        case LINUX:
            // ${user.home}/.java/deployment/security/trusted.jssecacerts
            certPath += ".java" + File.separator + "deployment";
            break;
        default:
            break;
    }
    certPath += File.separator + "security" + File.separator + "trusted.jssecacerts";

    File certInputFile = new File(certPath);
    FileInputStream certInputStream = null;
    if (certInputFile.canRead())
    {
        certInputStream = new FileInputStream(certInputFile);
        keystore.load(certInputStream, null);
    }
    else
    {
        keystore.load(null);
    }

    keystore.setCertificateEntry("cert-alias", cert);

    FileOutputStream certOutputFile = new FileOutputStream(certInputFile);
    keystore.store(certOutputFile, "".toCharArray());
    certOutputFile.close();

    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keystore);
    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, tmf.getTrustManagers(), null);
    return context.getSocketFactory();
}