Как получить доступ к URL, который требует сертификата SafeNet eToken, используя Java

Добрый день,

У меня уже есть SafeNet 5100 eToken с действующим сертификатом, который я использую для доступа к веб-приложению моей компании, которому оно требуется.

Когда я пытаюсь получить доступ к веб-приложению с помощью веб-браузера (например, Chrome), все работает нормально, и у меня нет проблем. Откроется диалоговое окно SafeNet, я введу свой пароль и смогу зайти на сайт.

Сейчас я пытаюсь получить доступ к этому веб-приложению через Java-программу (я программирую его с помощью затмения IDE) и не могу найти, как это сделать. Есть ли какой-нибудь API от SafeNet для этого или каких-либо онлайн-руководств?

Я смотрел в этой теме, как использовать Microsoft Crypto API с USB-ключом после PKCS # 11, но не мог понять, как работает этот CryptoAPI CSP. Любая помощь приветствуется.

Спасибо

2 ответа

Решение

Я узнал, как это сделать, благодаря этим двум темам:

Как получить KeyStore с токена usb в Java
Java Keytool с провайдером opensc pkcs#11 работает только с включенной опцией отладки

И этот сайт:

Подписание PDF с использованием eToken в Java

Во-первых, если у веб-сайта есть сертификат, которому java не доверяет по умолчанию, вы должны создать trustStore и загрузить его в системные свойства java. Вы можете увидеть, как это сделать здесь:

Oracle - Генерация KeyStore и TrustStore (используя keytool)

Чем вам нужно найти, где на вашем компьютере установлена ​​библиотека PKCS#11, используемая для вашей smartCard / eToken, у меня она находится в "C:\Windows\System32\eTPKCS11.dll". Затем создайте файл.cfg следующим образом:

name=SafeNet
library=C:\Windows\System32\eTPKCS11.dll
slot=4

Где вы даете ему имя и путь к вашей библиотеке PKCS#11. Слот - это слот, к которому подключена ваша eToken/SmartCard (вам не нужно устанавливать это, если вы не хотите).

Теперь мой код выглядит так:

System.setProperty("javax.net.ssl.trustStore", "cfgFiles/trustedHttpsCertificates.truestore");
System.setProperty("javax.net.ssl.trustStoreType", "jks");
System.setProperty("javax.net.ssl.trustStorePassword", "oiadad");

Provider newProvider = new SunPKCS11("cfgFiles/etpkcs11.cfg");
Security.addProvider(newProvider);

try {
    KeyStore keyStore = KeyStore.getInstance("PKCS11");
    keyStore.load(null, "".toCharArray());

    KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyFactory.init(keyStore,null);

    SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
    sslContext.init(keyFactory.getKeyManagers(), null, null);
    sslSocketFactory = sslContext.getSocketFactory();

} catch (KeyStoreException e) {
    e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (CertificateException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (NoSuchProviderException e) {
    e.printStackTrace();
} catch (UnrecoverableKeyException e1) {
    e1.printStackTrace();
} catch (KeyManagementException e1) {
    e1.printStackTrace();
}

Сначала я говорю Java, где искать мой trustStore. Затем я передаю путь к своему файлу cfg, создаю с ним провайдера и сообщаю безопасности, что этот новый провайдер существует.

После этого я инициализирую и загружаю хранилище ключей PKCS11 с пустым паролем (мог бы передать свой реальный пароль, если бы захотел, но таким образом появляется всплывающее окно SafeNet и запрашивает мой пароль).

Затем я создаю экземпляр KeyManagerFactory и SSLSocketFactory. Это последний шаг к использованию eToken для получения доступа к URL-адресам многофакторной аутентификации.

Теперь есть еще одна хитрость для доступа к защищенному веб-сайту https: вам нужно дать HttpsURLConnection новый SSLSocketFactory. Вы можете сделать это так:

try {
    HttpsURLConnection conn = (HttpsURLConnection)new URL(<your-https-url-here>).openConnection();
    conn.setRequestMethod("GET");
    conn.setDoInput(true);
    conn.setSSLSocketFactory(sslSocketFactory);

    int responseCode = conn.getResponseCode();
    System.out.println("RESPONSE: " + responseCode);

    InputStream inputstream = conn.getInputStream();
    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

    String line = null;
    String htmlResponse = "";

    while ((line = bufferedreader.readLine()) != null) {
        htmlResponse += line + "\n";
        //System.out.println("html: " + line);
    }
} catch (ProtocolException e) {
    e.printStackTrace();
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

Я надеюсь, что это поможет всем, у кого возникли проблемы с eTokens или SmartCards.

Я не эксперт SafeNet. Вы можете попробовать утверждения SAML для входа в safeNet. В Java есть API OpenSAML для генерации утверждения SAML.

Другие вопросы по тегам