WCF REST + SSL

shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

WCF REST + SSL

Post by shadow7256 »

Сделал WCF REST сервис который принимает файлы (через Stream). Все работает.
Но сказали что в будущем клиент потребует чтобы сервис работал через HTTPS. Сервис крутится внутри Windows Service (self hosted). Порылся в инете, поменял код инициализации сервиса:

Code: Select all


var url = "https://localhost:7070/FileUploader";

var sh = new ServiceHost(typeof(FileUploader));

var binding = new WebHttpBinding
{
        TransferMode = TransferMode.Streamed
   ........
}

binding.Security = new WebHttpSecurity { Mode = WebHttpSecurityMode.Transport };

sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName,                         "certificateSubj");

var se = sh.AddServiceEndpoint(typeof(IFileUploader), binding, url);
se.Behaviors.Add(new WebHttpBehavior());
sh.Open();
Клиентский код без изменений, только поменялся URL (вместо http стало https):

Code: Select all

var request = (HttpWebRequest)WebRequest.Create(requestUrl);
 request.Method = "POST";
 request.ContentType = "text/plain";
 request.Accept = "application/json";
               
 var fileToSend = File.ReadAllBytes(filePath);
 request.ContentLength = fileToSend.Length;

 try
  {
       using (var requestStream = request.GetRequestStream())
        {
              requestStream.Write(fileToSend, 0, fileToSend.Length);
        }
   .......
}
на request.GetRequestStream() вылетает ексепшен - Unable to read data: Remote host has closed connection

надо ли на клиенте что то делать, после того как сервис перешел на HTTPS?

Спасибо
User avatar
Boriskin
Уже с Приветом
Posts: 18906
Joined: 30 Aug 2001 09:01
Location: 3rd planet

Re: WCF REST + SSL

Post by Boriskin »

По идее, и клиенту и сервису надо указать на что-то, что поможет им успешно провести ssl handshake между собой (ака сертификаты), я не помню, можно ли это вообще сделать без сертификата с каждой из сторон, если можно, то скорее всего надо специально это указывать (но тогда теряется весь смысл оборачивания в ssl).
На сервисной стороне у вас что-то куда то указывает, но скорее всего, никакого сертификата там нет; на клиентской стороне нет ничего. Я думаю, что-то косячит в этой области.

ЗЫ Когда то давно у MS был косяк по открытию https соединения на уровне CHttpConnection (который в MFC), там что то отваливалось на первом вызове и надо было вызывать еще раз с правильно подправленными параметрами. Скорее всего они должны были это пофиксить, но есть шанс, что проблема перекочевала и в абстракции более высокого уровня. Но я думаю, что это не ваш случай.
Тупизна как Энтропия. Неумолимо растет.
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: WCF REST + SSL

Post by shadow7256 »

Да, похоже Вы правы. На серверной стороне сертификат вроде привязывается к endpoint, по крайней мере в дебаге я вижу это. А вот на стороне клиента я ничего не выставляю как сертификат. Надо глянуть в эту сторону.
User avatar
Sergunka
Уже с Приветом
Posts: 34164
Joined: 03 Dec 2000 10:01
Location: Vladivostok->San Francisco->Los Angeles->San Francisco

Re: WCF REST + SSL

Post by Sergunka »

shadow7256 wrote:Да, похоже Вы правы. На серверной стороне сертификат вроде привязывается к endpoint, по крайней мере в дебаге я вижу это. А вот на стороне клиента я ничего не выставляю как сертификат. Надо глянуть в эту сторону.
https://github.com/SVyatkin/tomcat-ssl-java-example

https://vyatkins.wordpress.com/2013/11/ ... fications/

Я помнится с этого дела и начал писать свой блог - особ обратите внимание на баш скрипт который генерит сертификаты как для сервера так и для клиента

https://github.com/SVyatkin/tomcat-ssl- ... er/scripts

это моя особоая гордость
#!/bin/bash
# $1 : server name
# $2 : password

echo $1 $2
#
echo generate server key store
#
keytool -genkey -alias $1_server -keyalg RSA -dname "CN=$1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass $2 -keystore $1_server.jks -storepass $2
#
echo generate client key store
#
keytool -genkey -alias $1_client -keystore $1_client.p12 -storetype pkcs12 -keyalg RSA -dname "CN=$1_client,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass $2 -storepass $2
#
echo export client cert
#
keytool -exportcert -alias $1_client -file $1_client.cer -keystore $1_client.p12 -storetype pkcs12 -storepass $2
#
echo import client cert to server trust store
#
keytool -importcert -keystore $1_server_trust_store.jks -alias $1 -file $1_client.cer -v -trustcacerts -noprompt -storepass $2

#
echo export server cert
#
keytool -exportcert -alias $1_server -file $1_server.crt -keystore $1_server.jks -storetype jks -storepass $2

#
echo import server cert to client trust store
#

keytool -importcert -keystore $1_client_trust_store.jks -alias $1 -file $1_server.crt -v -trustcacerts -noprompt -storepass $2

#
echo list certs server trust store
#

keytool -list -v -keystore $1_server_trust_store.jks -storepass $2

#
echo list certs client trust store
#

keytool -list -v -keystore $1_client_trust_store.jks -storepass $2
"A patriot must always be ready to defend his country against his government." Edward Abbey
User avatar
Boriskin
Уже с Приветом
Posts: 18906
Joined: 30 Aug 2001 09:01
Location: 3rd planet

Re: WCF REST + SSL

Post by Boriskin »

Какие вести с полей - (рас/за)ковырял проблему?
Тупизна как Энтропия. Неумолимо растет.
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: WCF REST + SSL

Post by shadow7256 »

Boriskin wrote:Какие вести с полей - (рас/за)ковырял проблему?
к сожалению пока нет :( У класса HttpWebRequest на стороне клиента есть свойство - ClientCertificates. Я туда добавил тот же самый сертификат, который присваиваю на стороне сервера для endpoint. Таже байда. Ошибка таже.

Может быть для ClientCertificate нужно генерить отдельный сертификат :(

Вообщем пока отложили это дело.

Посмотрел пример Сергуньки, походу нужно два сертификата генерить? Один для сервера другой для клиента?
Palych
Уже с Приветом
Posts: 13684
Joined: 16 Jan 2001 10:01

Re: WCF REST + SSL

Post by Palych »

shadow7256 wrote:походу нужно два сертификата генерить? Один для сервера другой для клиента?
Смотря что нужно.
SSL/TLS строго говоря выполняет (может выполнять) 3 функции:
- Шифрование трафика
- Server authentication, чтобы клиент мог убедиться что сервер по данному адресу (FQDN) - тот, за кого он себя выдает
- Client authentication, чтобы сервер был уверен что клиент - тот, за кого себя выдает.

Далее - как и кто будет подписывать сертификаты, и нужно ли это вообще...

Скорее всего Вам нужна только шифровка.
Для этого сертификат нужен один.

Если делать так, как описал Sergunka (самый простой вариант, без всяких подписываний) - нужна половина процесса:
- сгенерировали пару ключей (keytool -genkey, или что там у виндов), получаем keystore - файл с приватными ключами
- вынимаем публичный ключ (keytool -export) в файл.
- публичный ключ даем клиенту, там импортируем его в truststore - файл с публичными ключами.
- keystore - даем серверу.
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: WCF REST + SSL

Post by helg »

Для установления https соединения надо, чтобы:
- на сервере был сертификат
- у клиента было доверие к этому сертификату
Обычно это реализуется как у браузеза и forum.privet.com - сервер предъявляет ID (сертификат), заверенный неким верхним нотариусом (CA, Certificate Authority), а клиент сконфигурирован так, чтобы верить всему, что подписано верхними нотариусами из списка.

В вашей ситуации надо либо чтобы у сервера был сертификат заверенный верхним CA, либо насильно сконфигурировать клиента так, чтобы он верил текущему сертификату сервера.

Return to “Вопросы и новости IT”