2016-04-12 26 views
0

fonksiyonel gereksinimleri şunlardır: Kullanıcı bir düğmeyi tıkladığındaSunucu kendinden imzalı sertifika kullandığında, VBA içindeki bir istemci tarafından doğrulanmış HTTPS POST işlemini nasıl yapabilirim?

  • Kullanım HTTP POST şirket güvenlik duvarı dışında bir Apache web sitesine Word içinde "içerik kontrolleri" den veri iletimi için.
  • Dış web sitesi benim tarafımdan kontrol ediliyor ve "İnternet Bölgesi" içinde.
  • Çözüm, kullanıcının makinesinde yazılım yüklemesi gerektirmez (dolayısıyla VBA'nın seçilmesi ve makro etkinleştirilmiş bir ofis belgesi).
  • VBA kodunun, BT departmanımız tarafından dağıtılan varsayılan güvenlik ayarlarını kullanarak kuruluşumdaki herkes için çalışması gerekir.
  • Harici web sitesi kendinden imzalı bir SSL sertifikası kullanıyor.
  • Kullanıcılar istemci kimlik doğrulaması için doğru anahtar kullanımını olan tek bir tanesi,
  • Her kullanıcının PIV kartı tam olarak aynı konuda (onlara) verilen birden çok sertifika vardır onların PIV kartı kullanarak harici web sitesine kimlik edecektir. Otomatik olarak imzalanan SSL sertifika rağmen site ile

    • Interact:

  • yukarıda göz önüne alındığında, çözüm otomatik olarak veya kullanıcı etkileşimi yoluyla, iki şey işlemek gerekir.
  • Kimlik doğrulaması için kullanıcının akıllı kartından doğru istemci sertifikasını seçin.

İlk denemem WinHTTPRequest nesnesini kullanmaktı. Kendinden imzalı sunucu sertifikası hatasını görmezden gelmek için yapılandırabilirdim. Ancak, SetClientCertificate yöntemi yalnızca sertifika konusunu (ve sertifika deposunu arayacak, ancak hepsi aynı sertifika deposunda) arayacaktır. Yani bazen bu yaklaşım bazen kriterlerin yerine getirildiği hangi sertifikanın seçildiğine bağlı olarak çalışır. Yapabilirsem bu yöntem benim için çalışacaktır: 1) diğer sertifika özniteliklerinin (genişletilmiş anahtar kullanımı, subjectaltname) nasıl aranacağını öğrenmek; veya 2] WinHTTPRequest'in sertifika seçiciyi kullanıcıya nasıl göstereceğini öğrenir.

İkinci deneme WinHTTPRequest öğelerini atmak ve InternetExplorer nesnesini kullanmaktır. Bu yaklaşım için, Visible özelliğinin doğru olduğundan emin olmalıyım, böylece kullanıcı işlemle etkileşime girebilir. IE'nin "Bu sitenin sertifikasıyla ilgili bir sorun var" sayfasının nasıl devre dışı bırakılacağını anlayamadım. Bu nedenle, kullanıcının bunu manuel olarak ele alması gerekiyor. IE, sertifika seçiciyi otomatik olarak görüntüler ve PIN'i ister. Ne yazık ki, SSL sayfasına yönlendirme ile ilgili bir şey POST'u bir GET'e dönüştürür. Ayrıca, tüm basit hata ayıklama baskı ifadelere BeforeNavigate2, NavigationComplete2, DocumentComplete ve TitleChange için olay işleyicileri yüklü. Ateş edilecek tek olay BeforeNavigate2. Hemen aynı "IEPostStringRequest" yöntemini çağırarak

tekrar SSL uyarı yönlendirme atlar ve doğru olarak GET yerine POST yöntemini kullanır.

tarif scattershot işlevsellik ve hatalar için telafi etmek bariz hacky çözüm ikinci yaklaşım kullanmak ve sadece iki kez IEPostStringRequest işlevini aramak. Ancak, ben aynı anda çözüm işlemek zorundadır iki şey işlemek için daha iyi bir yolu olup olmadığını sormak istiyorum?

Yani, bütün bu olan, açıklanan geçici çözümü içermeyen bu işi yapmak için bir yol var?

Benim sınıf modülü, ikinci seçenek için:

Option Explicit 

Private WithEvents ie As InternetExplorer 

Public Sub Init() 
    Set ie = CreateObject("InternetExplorer.Application") 
    'You can uncoment Next line To see form results As HTML 
    ie.Visible = True 
End Sub 

Private Sub ie_TitleChange(ByVal sText As String) 
    Debug.Print "Title changed to: " + sText 
End Sub 


Private Sub ie_NavigateComplete2(ByVal pDisp As Object, Url As Variant) 
    Debug.Print "Navigation to " + Url + " Complete" 
End Sub 

Private Sub ie_BeforeNavigate2(ByVal pDisp As Object, _ 
    ByRef Url As Variant, _ 
    ByRef Flags As Variant, _ 
    ByRef TargetFrameName As Variant, _ 
    ByRef PostData As Variant, _ 
    ByRef Headers As Variant, _ 
    ByRef Cancel As Boolean) 

    Debug.Print "Going to " + Url 
    Debug.Print "Headers: " + Headers 
End Sub 

Private Sub ie_DocumentComplete(ByVal pDisp As Object, Url As Variant) 
    Debug.Print Url 
End Sub 

'sends URL encoded form data To the URL using IE 
Public Sub IEPostStringRequest(Url, FormData) 
    'Send the form data To URL As POST request 
    Dim bFormData() As Byte 
    ReDim bFormData(Len(FormData) - 1) 
    bFormData = StrConv(FormData, vbFromUnicode) 
    ie.Navigate Url, 2 + 4 + 8, Nothing, bFormData, _ 
     "Content-type: application/x-www-form-urlencoded" 
End Sub 

cevap

İlgili konular