Подписание документов с помощью SunMSCAPI и отключение диалога «Ввод PIN» - PullRequest
2 голосов
/ 27 июня 2011

Я разрабатываю код Java, который подписывает документы с использованием токена сертификата.Пока все отлично работает, но я хочу отключить диалоговое окно ввода пин-кода, потому что я храню пин-код пользователя, поэтому ему / ей не нужно каждый раз вводить его.Настоящая проблема здесь заключается в том, что этот код будет работать в пакетном режиме (без взаимодействия с пользователем).Я знаю, что после ввода ключ может находиться в памяти, поэтому его не нужно вводить снова в течение короткого времени.Но я не могу полагаться на это, мне нужно предоставить PIN-код.Вот код, который у меня есть (это только пример, он может быть неполным или не работать):

protected KeyStore loadKeyStoreFromSmartCard()  {
  keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
  keyStore.load(null, null);
  return keyStore;
}

public void signDocument(byte[] conteudoParaAssinar, String certAlias) {
    char[] pass = (char[]) null;
    PrivateKey key = (PrivateKey) loadKeyStoreFromSmartCard.getKey(certAlias, pass);
    Certificate[] chain = loadKeyStoreFromSmartCard(true).getCertificateChain(certAlias);
    CertStore certsAndCRLs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)), "BC");
    X509Certificate cert = (X509Certificate) chain[0];
    CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
    gen.addSigner(key, cert, CMSSignedDataGenerator.DIGEST_SHA1);
    gen.addCertificatesAndCRLs(certsAndCRLs);
    CMSProcessable data = new CMSProcessableByteArray(conteudoParaAssinar);
    CMSSignedData signed = gen.generate(data, true, "SunMSCAPI");
    byte[] envHex = signed.getEncoded();
}

РЕДАКТИРОВАТЬ

Я слышал о CryptSetProvParam PP_KEYEXCHANGE_PIN Ведьма может быть решением, но я не знаю, как вызвать его из Java.Все примеры, которые я нашел, относятся к .net.

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Однажды я реализовал нечто похожее на это, но, к сожалению, драйвер смарт-карты глючил, поэтому драйвер пытался вызвать собственный обратный вызов ПИН-кода, реализованный в самом драйвере время от времени. Но давайте предположим, что ваш драйвер работает лучше.

Прежде всего, вам необходимо реализовать CallbackHandler , документация дает хороший обзор концепции. В вашем случае это интересный случай с PasswordCallback .

Затем создайте KeyStore следующим образом (обработка исключений пропущена)

Provider provider = Security.getProvider("SunMSCAPI");
CallbackHandler cbh = // your implementation
KeyStore.ProtectionParameter protection = new KeyStore.CallbackHandlerProtection(cbh);
//get a handle of the CAPI KeyStore as before
KeyStore.Builder keystoreBuilder = KeyStore.Builder.newInstance("Windows-MY",
                                                                provider, 
                                                                protection);
KeyStore store = keystoreBuilder.getKeyStore();

Затем, чтобы получить доступ к закрытому ключу, сделайте следующее:

KeyStore.Entry ke = store.getEntry(alias, null);
if (!(ke instanceof KeyStore.PrivateKeyEntry))
    throw new RuntimeException("The entry is not a private key.");
PrivateKey key = ((KeyStore.PrivateKeyEntry) ke).getPrivateKey();

Поставщик автоматически сгенерирует соответствующие PasswordCallback s для отправки на ваш CallbackHandler. При обработке обратного вызова вы просто передадите свой кешированный пароль.

Само собой разумеется, что кеширование паролей обычно осуждается;)

0 голосов
/ 27 июня 2011

MS CryptoAPI не предоставляет единого способа указания PIN-кода. Единственный вариант - переключиться с CyrptoAPI на PKCS # 11, если это возможно - PKCS # 11 требует, чтобы вы выполнили вход на устройство в коде и также указали PIN-код в коде.

Обновление: некоторые модули CSP (провайдера криптографических услуг), поставляемые некоторыми поставщиками оборудования, позволяют вызывать специальную функцию CryptoAPI (CSPSetProvParam, http://msdn.microsoft.com/en-us/library/aa379858%28v=VS.85%29.aspx) и передавать ей PIN-код. поставщику информации, если CSP вашего оборудования поддерживает этот метод установки PIN-кода, и если да, то каков точный идентификатор параметра и т. д.

...