Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA & HTTPS / 8 сообщений из 8, страница 1 из 1
11.03.2008, 12:37
    #35182176
scoritt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
Подскажите плз кто-нибудь принципы работы с HTTPS из VBA. В данный момент приложение использует MSXML.XMLHTTPRequest для отправки запросов на web сервис через HTTP. Как это будет выглядеть при добавлении SSL? Спасибо.
...
Рейтинг: 0 / 0
11.03.2008, 13:44
    #35182435
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
все так же, только кое-что придется добавить в коде на предмет подписи

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 130      Set objSrvHTTP = New MSXML2.ServerXMLHTTP40
 131      objSrvHTTP.setTimeouts lResolve, lConnect, lSend, lReceive
 240      objSrvHTTP.Open "POST", CStr(URL), False
 250      objSrvHTTP.setRequestHeader "Content-Type", ContentType ' "application/x-www-form-urlencoded"
'получаем подписанные выбранным сертификатом данные
 270      Signature = mHTTP.GetSignature(SendQuery, ErrCode, ErrDesc)
'добавляем полученные данные в заголовок запроса
 280      objSrvHTTP.setRequestHeader "Your-Signature-name", Signature
 290      objSrvHTTP.send SendQuery


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
Public Function GetSignature(ByRef Request As String, Optional ByRef ErrCode As Long, Optional ByRef ErrDesc As String) As String
Dim s As String
Dim b As Boolean

        GetSignature = ""
        If Len(mMain.CertificateName) =  0  Then
            LogInfo "GetSignature: Не указан сертификат клиента."
            Exit Function
        End If
        b = mHTTP.SignData(mMain.CertificateName, Request, s)
        If b Then
            GetSignature = s
        End If
    
End Function

Public Function SelectCertificate(Optional ByVal CertName As String = "") As CAPICOM.ICertificate
'<EhHeader>
On Error GoTo Err_debug
'</EhHeader>
Dim MyStore As CAPICOM.Store
Dim i As Integer

    Set MyStore = New CAPICOM.Store
    MyStore.Open CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY
    If CertName <> "" Then
        For i =  1  To MyStore.Certificates.Count
            If MyStore.Certificates.Item(i).GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME) = CertName Then
                Set SelectCertificate = MyStore.Certificates.Item(i)
                GoTo lb_out
            End If
        Next i
        LogInfo "SelectCertificate: Error - неверный сертификат=" & CertName
    Else
        Set SelectCertificate = MyStore.Certificates.Item( 1 )
    End If
    
'<EhFooter>
lb_out:
    Set MyStore = Nothing
    Exit Function

Err_debug:
    LogError "SelectCertificate"
    Resume lb_out
'</EhFooter>
End Function


Public Function SignData(ByVal CertificateName As String, ByVal InputData As String, ByRef sSignedData As String) As Boolean
'<EhHeader>
On Error GoTo Err_debug
'</EhHeader>
Dim SignedData As CAPICOM.SignedData
Dim Signer As CAPICOM.Signer
Dim TimeAttribute As CAPICOM.Attribute

    SignData = False

    Set SignedData = New CAPICOM.SignedData
    Set Signer = New CAPICOM.Signer
    Set TimeAttribute = New CAPICOM.Attribute
    

    ' Set the data that we want to sign
    SignedData.Content = InputData
    Signer.Certificate = SelectCertificate(CertificateName)
            
    'Set the time in which we are applying the signature
    TimeAttribute.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
    TimeAttribute.Value = VBA.Date
        
    Signer.AuthenticatedAttributes.Add TimeAttribute
            
    'Do the Sign operation
    sSignedData = SignedData.Sign(Signer, True)
    
    
    SignData = True
    
'<EhFooter>
lb_out:
    Set SignedData = Nothing
    Set Signer = Nothing
    Set TimeAttribute = Nothing
    Exit Function

Err_debug:
    LogError "SignData"
    Resume lb_out
'</EhFooter>
End Function
...
Рейтинг: 0 / 0
11.03.2008, 13:52
    #35182464
scoritt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
Спасибо за ответ. Насколько я понял второй блок кода отвечает за получение сертификата... А можно вкратце о сертификатах (ну или ссылочку на информацию)? Сертификат - это просто файл? Нужна ли каккая-нибудь регистрация на машине пользователя?
...
Рейтинг: 0 / 0
11.03.2008, 14:07
    #35182514
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
сертификат может быть и в файле (расширение pfx), но как правило он в личном хранилище сертификатов пользователя. а вообще почитайте в msdn по ServerXMLHTTP40 там есть примеры, может в вашем случае будет все намного проще и подписывать данные не нужно личным сертификатом пользователя :)
...
Рейтинг: 0 / 0
11.03.2008, 14:58
    #35182698
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
http://download.microsoft.com/download/9/6/5/9657c01e-107f-409c-baac-7d249561629c/MSXML4SP_RelNote.htm

тут посмотри еще
...
Рейтинг: 0 / 0
27.03.2008, 14:39
    #35217916
scoritt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
Выяснил такую вещь.
При указании для MSXML.XMLHTTPRequest не http а https соединения подключение ведёт себя так же, как если бы это был обычный IE: то есть при наличии сертификата сервера в доверенных источниках просто осуществляет подключение, а при отсутствии в доверенных источниках выдаёт сообщение о том, что данный сертификат не является доверенным и предлагает осуществить подключение для данной сессии, либо инсталлировать сертификат.
То есть пользователь при каждой новой сессии приложения при попытке подключения будет получать это окно и нажимать кнопку для разрешения подключения (предполагается что пользователь не может инсталлировать сертификат).

Есть ли способ программно подавить это окно, для того чтобя по умолчанию соединение было разрешено?

Спасибо
...
Рейтинг: 0 / 0
27.03.2008, 15:02
    #35218031
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
> Автор: scoritt
> Выяснил такую вещь.

> Есть ли способ программно подавить это окно, для того чтобя по
> умолчанию соединение было разрешено?

Через руководство произвести мотивацию админа на установку нужных
сертификатов на клиентских машинах. А что-бы это было программно подари
руководителю или админу какую нибудь программу

> Спасибо
Не за что

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.04.2008, 16:13
    #35283957
poltora
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA & HTTPS
вы нашли решение своей задачи?
может быть эта проблема аналогична вашей и вы сможете подсказать выход из тупика...

ниже представлен тестовый пример, который подписывает тестовые данные и тут же проверяет подпись.

проблема в том, что подпись является невалидной.

my $data = '1234567890';
my $user = '18b729e9d7485c1b12964e2ef3fba8a8'; # идентификатор юзера, по которому находится сертияикат (ниже)


# ищем сертификат
my $Store = Win32::OLE->new('CAPICOM.Store') or die "Cannot start CAPICOM.Store";
$Store->Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY );

my $Certificates = $Store->Certificates;
my $certificate;
for ( my $i = 1 ; $i <= $Certificates->Count() ; $i++ ) {
my $Certificate = $Certificates->Item($i);
if ( hashSubjectName( $Certificate->SubjectName() ) eq $user ) {
$certificate = $Certificate;
last;
}
}
print $certificate->SubjectName(); # да, наш сертификат, имеет приватный ключ $Certificate->HasPrivateKey()

# подписываем выше найденным сертификатом
my $Signer = Win32::OLE->new('CAPICOM.Signer') or die "Cannot start CAPICOM.Signer";
$Signer->LetProperty( 'Certificate', $certificate );

my $SignedData = Win32::OLE->new('CAPICOM.SignedData') or die "Cannot start CAPICOM.SignedData";
$SignedData->LetProperty( 'Content', $data ); # или $SignedData->Content($data) ?
my $signature = $SignedData->Sign( $Signer, 1, CAPICOM_ENCODE_BASE64 );

print $signature; # что-то есть

# проверяем подпись
my $SignedData = Win32::OLE->new('CAPICOM.SignedData') or die "Cannot start CAPICOM.SignedData";
$SignedData->LetProperty( 'Content', $data ); #или $SignedData->Content($data) ?

print $SignedData->Verify( $signature, 1, CAPICOM_VERIFY_SIGNATURE_ONLY );
# возвращается undef, что значает, что подпись неверна (и так ли это?)

если вывести все переменные сертификата из подписи(!) -
$SignedData->Certificates(1);
- то окажется, что он похож на исходный сертификатор (которым подписывали), НО он не имеет приватного ключа ($Certificate->HasPrivateKey())

в каком месте я допускаю ошибку?

имеет смысл использовать CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE ?
заранее спасибо.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA & HTTPS / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]