template

Index :: VBScript :: Zertifikate (xenroll.dll)

Achtung: Diese Beispiele sind nur im MSIE (unter Windows) lauffähig. Andere Browser erfordern eine alternative Vorgehensweise, d.h. eine Browserweiche ist unumgänglich.

Die nötigen Funktionen werden von der DLL xenroll.dll, die sich im Windows-Systemordner befindet, über ein ActiveX-Objekt zur Verfügung gestellt.
Es ist zu beachten, dass diese DLL in 2 Versionen auf dem Client vorliegen kann. Deshalb betten wir sie mit den entsprechenden CLSIDs auch zweimal in <OBJECT>-Tags im HTML-Code ein und bestimmen per Trial-And-Error (Function GetEnrollObj()) die tatsächliche Version.

PKCS10 erstellen

Wir bauen den distinguished name anhand der Formularfelder zusammen und übergeben ihn der Function GetPKCS10(), die uns den PKCS10-String (Base64-kodiert) liefert. Dieser wird schließlich in einer Textarea angezeigt (siehe Beispiel).
Javascript im Header
function NOP() {}
VBScript im Header
Function DoForm() '==> liefert True, wenn PKCS10 erstellt werden konnte On Error Resume Next Dim f, sDN, sPKC, oEnroll sPKC = "": DoForm = False Set oEnroll = GetEnrollObj() If IsNull(oEnroll) Then Msgbox "Client-Bibliothek 'xenroll.dll' nicht gefunden": Exit Function End If '---- Werte fuer distinguished name holen Set f = document.f_gen sDN = "C=""" & f.pkc_C.value & """," & _ "ST=""" & f.pkc_ST.value & """," & _ "L=""" & f.pkc_L.value & """," & _ "O=""" & f.pkc_O.value & """," & _ "OU=""" & f.pkc_OU.value & """," & _ "CN=""" & f.pkc_CN.value & """," & _ "Email=""" & f.pkc_E.value & """" '---- PKCS10 erzeugen sPKC = GetPKCS10(oEnroll, sDN): f.spkc.value = sPKC DoForm = CBool(Len(sPKC)) End Function Function GetPKCS10(oEnroll, sDN) 'oEnroll: xenroll-Objekt 'sDN: distinguished name '==> liefert PKCS10-String (Base64-codiert) oder Leerstring On Error Resume Next GetPKCS10 = "" oEnroll.KeySpec = 1 oEnroll.GenKeyFlags = 3 GetPKCS10 = oEnroll.createPKCS10(sDN, "1.3.6.1.5.5.7.3.4") End Function Function GetEnrollObj() '==> liefert das Enroll-Objekt oder Null On Error Resume Next Dim p '---- auf neue Version testen Err.Clear: Set GetEnrollObj = EnrollNew p = GetEnrollObj.enumProviders(0, 0) 'Testzugriff If Err.Number = 0 Then Exit Function 'neue Version ok '---- auf alte Version testen Err.Clear: Set GetEnrollObj = EnrollOld p = GetEnrollObj.enumProviders(0, 0) If Err.Number = 0 Then Exit Function 'alte Version ok Set GetEnrollObj = Null '---- keine Version vorhanden End Function
Weiter unten, im BODY, das eingebettete Objekt (mit beiden clsid-Versionen):
<OBJECT id='EnrollNew' codebase='xenroll.dll' style='DISPLAY:none' classid='clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1'></OBJECT> <OBJECT id='EnrollOld' codebase='xenroll.dll' style='DISPLAY:none' classid='clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1'></OBJECT>
Das Formular:
<table> <form name='f_gen' action='javascript:NOP()' onSubmit='vbscript:DoForm' method='post'><tr> <td align='right'>Land [C]</td> <td><input name='pkc_C' value='DE' size='4'></td> </tr><tr> <td align='right'>Bundesland [ST]</td> <td><input name='pkc_ST' value='Pfalz' size='24'></td> </tr><tr> <td align='right'>Ort [L]</td> <td><input name='pkc_L' value='Busenberg' size='24'></td> </tr><tr> <td align='right'>Organisation [O]</td> <td><input name='pkc_O' value='Meier IT' size='24'></td> </tr><tr> <td align='right'>Organisation/Unit [OU]</td> <td><input name='pkc_OU' value='Meier CA' size='24'></td> </tr><tr> <td align='right'>Common Name [CN]</td> <td><input name='pkc_CN' value='Ruediger Meier' size='24'></td> </tr><tr> <td align='right'>[EMail]</td> <td><input name='pkc_E' value='it@meier.de' size='32'></td> </tr><tr> <td colspan='2' align='center'><input type='submit' value='PKCS10 (Base64) Erstellen'></td> </tr><tr> <td colspan='2'>&nbsp;</td> </tr><tr> <td colspan='2' align='center'><textarea name='spkc' cols='80' rows='20'></textarea></td> </tr></form></table>
In einer realen Anwendung sollte die Function DoForm() den Inhalt der Formularfelder natürlich erst übernehmen, nachdem er geprüft und abgesegnet wurde: Es müssen z.B. Gänsefüßchen entfernt oder ersetzt werden, weil sie im DN als Textbegrenzer dienen. Ebenso sollten Sonderzeichen wie dt. Umlaute vermieden bzw. ersetzt (siehe PHP-Hilfsfunktionen -> FilterDN()) werden. Schließlich ist noch auf Mussfelder/Leereingaben zu prüfen.

Im erweiterten Beispiel werden die Texteingaben z.B. bereits beim Client durch Javascript kontrolliert (siehe Javascript-Hilfsfunktionen -> FilterDN()). Ausserdem wird das PKCS10-Objekt zu Debuggingzwecken im Base64-Format und als HexDump angezeigt.

Die OID im zweiten Parameter von createPKCS10() kann übrigens folgende Werte besitzen:
1.3.6.1.5.5.7.3.1 = Server Authentication
1.3.6.1.5.5.7.3.2 = Client Authentication
1.3.6.1.5.5.7.3.3 = Code signing
1.3.6.1.5.5.7.3.4 = S/MIME signing
1.3.6.1.5.5.7.3.5 = Timestamp signing

Liste der CSP ermitteln

Im zweiten Beispiel wird die xenroll.dll dazu benutzt, die Liste der CSP (cryptographic service providers) zu ermitteln, die auf dem Client registriert sind. Auch hier wird das Ergebnis in eine Textarea geschrieben (siehe Demo):
VBScript im Header
Function GetCSPList() '==> liefert CSP-Liste oder Leerstring On Error Resume Next Dim oEnroll, sCSP, i GetCSPList = "": Set oEnroll = GetEnrollObj() If IsNull(oEnroll) Then Msgbox "Client-Bibliothek 'xenroll.dll' nicht gefunden": Exit Function End If i = 0: Err.Clear Do sCSP = oEnroll.enumProviders(i, 0): If CBool(Err.Number) Then Exit Do If CBool(Len(GetCSPList)) Then GetCSPList = GetCSPList & Chr(13) & Chr(10) GetCSPList = GetCSPList & sCSP: i = i + 1 Loop End Function Function GetEnrollObj() '==> liefert das Enroll-Objekt oder Null On Error Resume Next Dim p '---- auf neue Version testen Err.Clear: Set GetEnrollObj = EnrollNew p = GetEnrollObj.enumProviders(0, 0) 'Testzugriff If Err.Number = 0 Then Exit Function 'neue Version ok '---- auf alte Version testen Err.Clear: Set GetEnrollObj = EnrollOld p = GetEnrollObj.enumProviders(0, 0) If Err.Number = 0 Then Exit Function 'alte Version ok Set GetEnrollObj = Null '---- keine Version vorhanden End Function
Weiter unten, im BODY, das eingebettete Objekt (mit beiden clsid-Versionen):
<OBJECT id='EnrollNew' codebase='xenroll.dll' style='DISPLAY:none' classid='clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1'></OBJECT> <OBJECT id='EnrollOld' codebase='xenroll.dll' style='DISPLAY:none' classid='clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1'></OBJECT>
Anzeigebereich für die CSP-Liste:
<textarea id='taCSP' cols='80' rows='20'></textarea>
Noch ein VBScript-Block zum Holen und Anzeigen der Liste:
<SCRIPT language='vbscript'> taCSP.value = GetCSPList() </SCRIPT>

Index :: VBScript


template