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.
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'> </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
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>
template |
 |