3

我正在试验相对较新的 SunMSCAPI 安全提供程序。我想构建一个简单的小程序,提示浏览器弹出证书选择框。我会从那里拿走它。我已经用谷歌搜索了一种方式和另一种方式。有什么建议吗?

4

2 回答 2

1

我正在(苦苦挣扎)做类似的事情——尽管对于一个非网络应用程序。到目前为止,唯一对我有用的解决方案是对 C# 做一个 JNI(使用 MCPP 包装)。

于 2011-02-08T20:07:08.883 回答
0

您可以使用SunMSCAPI提供程序来实例化本地客户端 Windows 密钥库。您可以使用以下代码简单地做到这一点:

KeyStore keyStore = KeyStore.getInstance("Windows-MY",new SunMSCAPI());
keyStore.load(null, null);

或者,如果您愿意,可以将提供程序添加到安全列表中,而不是将其传递给getInstance()调用:

SunMSCAPI providerMSCAPI = new SunMSCAPI();
Security.addProvider(providerMSCAPI);
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);

请注意,它可能已默认添加到 Windows 操作系统上的 java 安装的安全提供程序列表中。

您的问题没有太多详细信息,因此我举一个示例,例如显示本地客户端 windows 密钥库中相关证书的所有别名和主题,以说明此提供程序的使用:

package org.catcert.crypto.keyStoreImpl.windows;

import java.security.KeyStore;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;

import sun.security.mscapi.SunMSCAPI;

public class Example {

    public static void main(String args[]) throws Exception {
        KeyStore keyStore = KeyStore.getInstance("Windows-MY",new SunMSCAPI());
        keyStore.load(null, null);

        // copy to avoid concurrent problems with aliases...
        ArrayList<String> aliases = Collections.list(keyStore.aliases());
        for(String alias : aliases){
            System.out.println("keyEntry alias: " + alias);
            X509Certificate cert = (X509Certificate)keyStore.getCertificate(alias);
            System.out.println("Certificate subject: " +  cert.getSubjectDN());

        }
    }
}

请注意,SunMSCAPI 是在 java 1.6 上引入的,但是在 java 1.7 上添加了对 64 位版本的支持。

于 2016-09-26T09:41:35.713 回答