2016-09-16 2 views
0

У меня есть сайт, на который я отправляю сообщение, которое в настоящее время поддерживает TLS v1.1 и TLS 1.2. Они скоро разрешат только соединения TLS ver 1.2. По этой причине я обновил Delphi 5 до Indy 10.Indy 10 и sslvTLSv1_2

В настоящее время я создаю свои компоненты в коде, и все работает отлично работает 3 темы, в то время:

HTTp := TIdHttp.Create(nil); 
     HTTP.OnSelectAuthorization := HTTPSelectAuthorization; 
     HTTP.HTTPOptions := [hoInProcessAuth,hoForceEncodeParams,hoKeepOrigProtocol]; 

     HTTP.OnStatus := HTTPStatus; 
     HTTP.OnWorkEnd := HTTPWorkEnd; 
     HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
     HTTP.ProxyParams.ProxyPort := ProxyPort; 
     HTTP.ProxyParams.ProxyUsername := ProxyUserName; 
     HTTP.ProxyParams.ProxyPassword := ProxyPassword; 
     HTTP.ProxyParams.BasicAuthentication := ProxyBasicAuth; 
    end; 

    If UseSSL and (SSL = nil) then 
    Begin 
     SSL := TIDSSLIOHandlerSocketOpenSSL.Create(nil); 
     SSL.SSLOptions.Mode := sslmClient; 
     SSL.OnGetPassword := SSLGetPassword; 
     SSL.SSLOptions.Method := sslvTLSv1_2; 
     HTTP.IOHandler := SSL; 
    end; 

Есть ли событие, которое я хотел бы сказать мне, что именно TLS версии я ток фактически соединяясь с при отправив сообщение? Я не хочу, чтобы это было неожиданностью, когда они, наконец, перестали принимать соединения TLS v1.1.

Спасибо.

+0

ли sslvTLSv1_2 позволяют v1.1 и 1,2 , или только 1,2? Разумеется, я бы поискал HTTP-сервер в Интернете, который позволяет только 1.2 и тестировать его. – mjn

+0

@mjn 'sslvTLSv1_2' представляет только 1.2. Если вы хотите поддерживать как 1.1, так и 1.2, вам нужно использовать свойство 'SSLOptions.SSLVersions' вместо свойства' SSLOptions.Method'. Это позволит вам одновременно включать несколько версий, поэтому OpenSSL может выполнять согласование версий для использования самой доступной версии. –

+0

@RemyLabeau, вы говорите, что если я использую «SSL.SSLOptions.Method: = sslvTLSv1_2», чтобы назначить SSL, если этот сервер не поддерживает TLS v1.2, я получаю сообщение об ошибке, и Indy не будет автоматически пытаться переключиться к TLSv1_1? Если это так, мне не нужно проверять статус, правильно? –

ответ

1

Для этой цели нет события. Вам нужно будет напрямую запросить базовый объект SSL, например, в событии OnStatus, используя функцию SSL_get_version().

Однако вы устанавливаете Method в TLS 1.2, так что все Indy будет использовать (если вы используете версию OpenSSL, которая поддерживает 1.2, в противном случае Indy будет тихо отбрасывать до 1.0).

На стороне записки, ваш UseSSL, если блок должен выглядеть следующим образом:

If UseSSL then 
Begin 
    If (SSL = nil) then 
    Begin 
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    SSL.SSLOptions.Mode := sslmClient; 
    SSL.OnGetPassword := SSLGetPassword; 
    SSL.SSLOptions.Method := sslvTLSv1_2; 
    End; 
    HTTP.IOHandler := SSL; 
end; 
+0

1. С приведенным выше кодом, не нужно ли просто назначать HTTP.IOHandler как нуль, правильно? –

+1

@RobertGriffinrealsol Мой пример всегда присваивает 'SSL'' IOHandler', если 'UseSSL' истинно, создавая' SSL', если он еще не существует. В исходном коде, если 'SSL' * уже * существует, он не присваивается' IOHandler', когда 'UseSSL' истинно. –

+0

2. Я использую OpenSSL, который я скачал для Indy 10, поэтому я предполагаю, что он поддерживает TLS v1.2. Я предполагаю, что это правильно, поэтому причина вопроса. Не могли бы вы привести пример использования SSL_get_version() и где его действительно ввести в код. Код, который я использую для публикации, - [HTTP.post (URL, ssSource, ssResult); HTTP.Disconnect;] –

0

Вот пример того, как вы можете получить информацию о версии SSL. (может потребоваться обновление, как я не использую последнюю версию Indy)

Декларация

procedure IdSSLIOHandlerSocketOpenSSLStatusInfoEx(ASender: TObject; 
    const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType, 
    AMsg: string); 

Присвоить

SSL.OnStatusInfoEx:=IdSSLIOHandlerSocketOpenSSLStatusInfoEx; 

Использование

procedure THttpThread.IdSSLIOHandlerSocketOpenSSLStatusInfoEx(ASender: TObject; 
    const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType, 
    AMsg: string); 
begin 
    if AsslSocket.version = TLS1_VERSION then 
    ... 
end; 
+0

Спасибо за ваш пример кода. Я попробовал это и еще не знаком с Indy 10, он не может скомпилировать TSSL-константу, которая неизвестна, и она выглядит из документов, которые событие StatusInfo изменило некоторые. Но мне говорят, что, пока я использую «SSL.SSLOptions.Method: = sslvTLSv1_2» в Indy 10, он использует только sslvTLSv1_2.Поэтому я просто предполагаю, что я связан с отправкой сообщений на 3 сайта, которые я отправляю. Я бы подумал, что я получаю какое-то исключение, если хост не поддерживает sslvTLSv1_2. –

+0

Вы должны добавить блок 'IdSSLOpenSSLHeaders' в раздел' uses' вашего проекта. – smooty86

+0

благодарит за код, но даже добавляет IdSSLOpenSSLHeaders к предложению uses и назначает SSL.OnStatusInfoEx: = IdSSLIOHandlerSocketOpenSSLStatusInfoEx ;, IdSSLIOHandlerSocketOpenSSLStatusInfoEx никогда не вызывается. Я сделал мероприятие простым для тестирования и добавил Break, поэтому среда IDE остановится при нажатии на событие, но событие никогда не запускалось. Любой другой способ, которым вы можете думать об этом, покажет версию TLS, которую использует программное обеспечение при ее подключении? Благодарю. –

Смежные вопросы