Проблема:
Я не могу подключиться к конечной точке веб-службы с поддержкой TLS, используя C # .net на windows7.
Fiddler запрос и ответ:
запрос: -
ПОДКЛЮЧИТЬ myendpoint: 9443 HTTP / 1.1
Принимающая сторона: myendpoint: 9443
Прокси-соединение: Keep-Alive"
и вот ответ: -
HTTP / 1.1 502 Ошибка подключения
Подключение: закрыть
Метка времени: 18: 54: 29,909
Не удалось установить соединение HTTPS.
* System.Net.Sockets.SocketException:
Невозможно установить соединение, так как целевой компьютер активно отказал в этом: 9443
в Fiddler.ServerChatter.CreateConnectedSocket (IPAddress [] arrDestIPs, Int32 iPort , Session _oSession) *
* at Fiddler.Session._handleHTTPSConnect () * "
Мой клиент - настольное / консольное приложение .net. Я не уверен, что правильно выполнил настройку / настройку TLS / сертификата на стороне клиента. Также у меня есть несколько вопросов без ответа.
Я сделал следующее:
У меня есть конечная точка "TLS включен" веб-службы Интернета. Для правильного общения мне были предоставлены 4 вещи:
1) ca.cert.pem: публичный сертификат от CA
2) myname.cert.pem: мой публичный сертификат
3) myname.key.pem: мой закрытый ключ
4) Пароль: «мой пароль»
Я также дал запрос сертификата (.csr) и параметры, использованные для генерации моего сертификата.
После прочтения материалов, связанных с TLS, я решил, что это то, что мне нужно сделать:
step1) Используйте Openssl, чтобы преобразовать ca.cert.pem в файл .cer и добавить / импортировать его в «Trusted Root Certificate Authorities» локального компьютера, чтобы теперь CA доверял.
step2) Объедините myname.cert.pem и myname.key.pem в .pkcs12, выполнив
" openssl pkcs12 -export -out keystore.pkcs12 -in myname.cert.pem -inkey myname.key.pem ". Это запрашивает пароль, где я использую «мой пароль».
step3) Добавьте keystore.pkcs12 в «Персональные» сертификаты (здесь запрашивается пароль, и я даю «mypassword»)
Отпечаток сертификата, добавленного на шаге 3: «fef4ab753a11a30a6c4342e63e00f237ef0818c1»
Теперь вот изменения app.config, которые я сделал:
<bindings>
<wsHttpBinding>
<binding name="My_HTTPS_Endpoint_Binding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="4096" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Certificate" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://myendpoint:9443/myService"
binding="wsHttpBinding" bindingConfiguration="My_HTTPS_Endpoint_Binding"
contract="MyNs.myClass" name="My_HTTPS_Endpoint" behaviorConfiguration="clientBehaviour" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="clientBehaviour">
<clientCredentials>
<clientCertificate findValue="fef4ab753a11a30a6c4342e63e00f237ef0818c1"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
Так что, кажется, я пропустил какой-то важный шаг? У меня есть пробелы в знаниях:
1) Насколько я понимаю, комбинация открытого и закрытого ключей, которую я имею, полезна только для связи от сервера к клиенту. Как работает шифрование сообщений клиент-сервер? Где мой клиент получает открытый ключ от сервера, который должен использоваться для шифрования сообщений?
2) Требуется ли пароль где-нибудь указывать в конфиге? Просто угадай ..