-
добрый день
Вопрос по организации своего HTTPs канала. Использую Delphi 7, Indy 10.1.5 и Win32OpenSSL 0.9.8g, поднят свой HTTP сервер (компонент TIdHTTPServer), пока без какого-либо шифрования.
Нужно "прикрутить" к нему OpenSSL. Обращаются к серверу только определенные мной клиенты, то есть никакого "общепризнанного" сертификата на нужно.
Свой сертификат генерирую так: cipher /R:CERTNAME openssl pksc12 -in CERTNAME.pfx -out CERTNAME.pem
1. Подскажите, нужно ли задавать пароли при создании ключей и сертификатов (если да, то где их указывать потом ?)
2. Где взять корневой сертификат, на который ссылается свойство SSLOptions.RootCertFile компонента TIdServerIOHandlerSSLOpenSSL - в книге "Indy in Depth/Глубины Indy" в переводе Подгорецкого предлагается получить его из Internet Explorer в диалоге Trusted Root Certificate Authority, но в случае создания своего сертификата это, наверное, делается как-то иначе
3. Что я должен дать клиентам, которым хочу разрешить доступ к своему серверу ? Как они зарегистрируют мои сертификаты (гугл предлагает много вариантов, из которых более достоверным кажется поместить файл в %UserProfile%\LocalSettings\CertStore) ?
4. Как я могу разрешить обращение к HTTP серверу с SSL шифрованием только пользователям, имеющим сертификат. Как я понимаю, нужно использовать TIdServerIOHandlerSSLOpenSSL.VerifyPeer, но что я могу проверить в обработчике ?.. в качестве входных параметров я получаю Certificate: TIdX509 и AOk: Boolean, не сравнивать же побайтно Certificate с какой-то своей строчной переменной ... или именно так все и делают ?
-
в случае создания своего ему надо задать флаг CA/
не сравнивать же побайтно
TIdX509 = class(TObject) protected ... public Constructor Create(aX509: PX509); virtual; Destructor Destroy; override; // property Fingerprint: TEVP_MD read RFingerprint; property FingerprintAsString: String read RFingerprintAsString; property Subject: TIdX509Name read RSubject; property Issuer: TIdX509Name read RIssuer; property notBefore: TDateTime read RnotBefore; property notAfter: TDateTime read RnotAfter; end;
-
> в случае создания своего ему надо задать флаг CA/
можно подробнее ? :)
-
certificate authority флаг. то есть самоподписанный сертификат.
-
Ок, с генерацией разобрался, вместо родительского подсунул копию основного (как сделано в демке инди)
Остался вопрос
Как реализовать на сервере проверку сертификатов клиентов. то есть прерывать на уровне ТIdServerIOHandlerSSLOpenSSL запросы тех, у кого сертификат не установлен ?
Допустим, пользователь обращается к моему серверу через стандартный браузер. Сервер отдает по HTTPs XML-документ, который в этом браузере может быть просмотрен. Что мне нужно предварительно дать пользователю (публичный ключ, полный сертификат, в каком формате) и что проверять в событии VerifyPeer ?
Я впервые работаю с SSL. хотелось бы получить ответ "для чайника"
-
p.s. в процессе откатился на OpenSSL 0.9.6m, так как с последней версией получал ошибки
|