Как получить доступ к 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.