Как я могу использовать различные сертификаты на определенных соединениях?

Для загрузки файла вы должны использовать элемент input с типом файла, но ваш селектор pick-files - это div, поэтому вы получили ошибку. Используйте селектор input[type=file] CSS:

public class FileUploadPopUp {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "G://ChromeDriver//chromedriver.exe");

        WebDriver driver=new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().window().maximize();

        driver.get("https://pdf2doc.com/");

        driver.findElement(By.cssSelector("input[type=file]")).sendKeys("F:\\Selenium Complete Notes.pdf"); 
    }
}
159
задан erickson 3 November 2016 в 03:27
поделиться

3 ответа

Создайте фабрику SSLSocket самостоятельно и установите ее на HttpsURLConnection перед подключением.

...
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslFactory);
conn.setMethod("POST");
...

You ' я захочу создать один SSLSocketFactory и сохранить его. Вот набросок его инициализации:

/* Load the keyStore that includes self-signed cert as a "trusted" entry. */
KeyStore keyStore = ... 
TrustManagerFactory tmf = 
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
sslFactory = ctx.getSocketFactory();

Если вам нужна помощь в создании хранилища ключей, прокомментируйте.


Вот пример загрузки хранилища ключей:

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(trustStore, trustStorePassword);
trustStore.close();

Чтобы создать хранилище ключей с сертификатом в формате PEM, вы можете написать свой собственный код, используя CertificateFactory , или просто импортировать его с помощью keytool из JDK (keytool не будет работать для «ключевой записи», но вполне подходит для «доверенной записи»).

keytool -import -file selfsigned.pem -alias server -keystore server.jks
162
ответ дан 23 November 2019 в 21:37
поделиться

Мы копируем хранилище доверенных сертификатов JRE и добавляем наши настраиваемые сертификаты в это хранилище доверенных сертификатов, а затем говорим приложению использовать настраиваемое хранилище доверенных сертификатов с системным свойством. Таким образом, мы оставляем хранилище доверенных сертификатов JRE по умолчанию в покое.

Обратной стороной является то, что при обновлении JRE новое хранилище доверенных сертификатов не объединяется с вашим пользовательским.

Возможно, вы могли бы справиться с этим сценарием, используя программу установки или запуск, которая проверяет хранилище доверенных сертификатов / jdk и проверяет наличие несоответствия или автоматически обновляет хранилище доверенных сертификатов. Я не знаю, что произойдет, если вы обновите хранилище доверенных сертификатов во время работы приложения.

Это решение не на 100% элегантно или надежно, но оно простое, работает и не требует кода.

12
ответ дан 23 November 2019 в 21:37
поделиться

Мне пришлось сделать что-то подобное, когда я использовал commons-httpclient для доступа к внутреннему https-серверу с самозаверяющим сертификатом. Да, наше решение заключалось в создании настраиваемого TrustManager, который просто передавал все (регистрируя сообщение отладки).

Это сводится к наличию нашей собственной SSLSocketFactory, которая создает сокеты SSL из нашего локального SSLContext, который настроен так, чтобы иметь только наши локальные TrustManager, связанный с ним. Ты не Мне вообще не нужно находиться рядом с хранилищем ключей / сертификатом.

Итак, это находится в нашей LocalSSLSocketFactory:

static {
    try {
        SSL_CONTEXT = SSLContext.getInstance("SSL");
        SSL_CONTEXT.init(null, new TrustManager[] { new LocalSSLTrustManager() }, null);
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("Unable to initialise SSL context", e);
    } catch (KeyManagementException e) {
        throw new RuntimeException("Unable to initialise SSL context", e);
    }
}

public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
    LOG.trace("createSocket(host => {}, port => {})", new Object[] { host, new Integer(port) });

    return SSL_CONTEXT.getSocketFactory().createSocket(host, port);
}

Наряду с другими методами, реализующими SecureProtocolSocketFactory. LocalSSLTrustManager - это вышеупомянутая фиктивная реализация диспетчера доверия.

12
ответ дан 23 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: