mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1360 lines
44 KiB
1360 lines
44 KiB
<HTML>
|
|
<!--
|
|
certnoca.hta - (CERT)srv web - (NO) (CA) cert-request management
|
|
|
|
This is an HTML application. We are assuming that we are running
|
|
on IE 5 (or compatible), stand alone from any CA.
|
|
|
|
-->
|
|
<Head>
|
|
<Title>No-CA Certificate Request Manager</Title>
|
|
</Head>
|
|
<Body BgColor=#FFFFFF OnLoad="postLoad();"><Font Face="Arial">
|
|
|
|
<Table border=0 CellSpacing=0 CellPadding=4 width=100% BgColor=#008080>
|
|
<TR>
|
|
<TD><font color=#FFFFFF size=-1 Face="Arial"><B><I>Microsoft</I></B> Certificate Services</Font></TD>
|
|
<TD Align=right><A href="" OnClick="goHome();return false;"><font color=#FFFFFF size=-1 Face="Arial"><B>Home</B></Font></A></TD>
|
|
</TR>
|
|
</Table>
|
|
|
|
<Form name=UIForm>
|
|
|
|
<!-- #################### PAGE 1 #################### -->
|
|
<Span ID="spnPage1">
|
|
|
|
<P> <B> Welcome </B>
|
|
<!-- Green HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD></TR></Table>
|
|
|
|
<P> You use this application to generate PKCS #10 certificate requests and install PKCS #7 certificates.
|
|
|
|
<P>
|
|
|
|
<Table border=0 cellspacing=0 cellpadding=0>
|
|
<TR>
|
|
<TD Colspan=3><Font Face="Arial"><B>Select a task:</B></Font></TD>
|
|
</TR><TR>
|
|
<TD rowspan=2><IMG Src="certspc.gif" alt="" height=1 width=20></TD>
|
|
<TD><INPUT type="radio" id=rbGenReq name=rbgrpAction checked value=1></TD>
|
|
<TD><Font Face="Arial"><Label for=rbGenReq>Generate a PKCS #10 certificate request</Label></Font></TD>
|
|
</TR> <TR>
|
|
<TD><INPUT type="radio" id=rbInstall name=rbgrpAction value=2></TD>
|
|
<TD><Font Face="Arial"><Label for=rbInstall>Install an PKCS #7 certificate</Label></Font></TD>
|
|
</TR>
|
|
</Table>
|
|
|
|
<P>
|
|
|
|
<!-- Green HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD></TR></Table>
|
|
<!-- White HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#FFFFFF><IMG Src="certspc.gif" alt="" height=5 width=1></TD></TR></Table>
|
|
|
|
<Table width=100% border=0 cellpadding=0 cellspacing=0><TR><TD align=right>
|
|
<INPUT type=button value="Next >" Name=btnNext1 style="width:.75in" OnClick="goNext();">
|
|
|
|
</TD></TR></Table>
|
|
|
|
</Span>
|
|
<!-- #################### PAGE 2 #################### -->
|
|
<Span ID="spnPage2" Style="display:none">
|
|
|
|
<P> <B> Generate A PKCS #10 Certificate Request </B>
|
|
<!-- Green HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD></TR></Table>
|
|
|
|
<Span ID="spnFixTxt" style="display:none">
|
|
<Table border=0 cellspacing=0 cellpadding=4 Style="Color:#FF0000"><TR><TD>
|
|
<I>Please correct the fields marked in <B><Font color=#FF0000>RED</Font></B>.</I>
|
|
One or more fields are contain the characters (, ; " or +)
|
|
that cannot be processed, or the e-mail or country fields contain non-English characters.
|
|
</TD></TR></Table>
|
|
</Span>
|
|
<Span ID="spnErrorTxt" style="display:none">
|
|
<Table border=0 cellspacing=0 cellpadding=4 Style="Color:#FF0000">
|
|
<TR><TD>
|
|
<B>An error occurred</B> while creating the certificate request.
|
|
Please verify that your CSP supports any settings you have made
|
|
and that your input is valid.
|
|
</TD></TR><TR><TD>
|
|
<B>Suggested cause:</B><BR>
|
|
<span ID="spnErrorMsg"></span>
|
|
</TD></TR><TR>
|
|
<TD><font size=-2>Error: <span ID="spnErrorNum"></span></font></TD>
|
|
</TR>
|
|
</Table>
|
|
</Span>
|
|
|
|
|
|
<P>
|
|
<Table Border=0 CellSpacing=0 CellPadding=0>
|
|
<TR> <!-- establish column widths. -->
|
|
<TD width=100></TD> <!-- label column, top border -->
|
|
<TD rowspan=59 width=4></TD> <!-- label spacing column -->
|
|
<TD></TD> <!-- field column -->
|
|
</TR>
|
|
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Size=-1><B>Identifying Information:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 height=2 BgColor=#008080></TD>
|
|
</TR><TR><TD colspan=3 height=6></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1><Span ID="spnNameLabel">Name:</Span></Font></TD>
|
|
<TD><Input Type="text" MaxLength="64" Size=42 Name="tbCommonName"></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1><Span ID="spnEmailLabel">E-Mail:</Span></Font></TD>
|
|
<TD><Input Type="text" MaxLength="64" Size=42 Name="tbEmail"></TD>
|
|
</TR><TR><TD height=8></TD> <TD></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1><Span ID="spnCompanyLabel">Company:</Span></Font></TD>
|
|
<TD><Input Type="text" MaxLength="64" Size=42 Name="tbOrg"></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1><Span ID="spnDepartmentLabel">Department:</Span></Font></TD>
|
|
<TD><Input Type="text" MaxLength="64" Size=42 Name="tbOrgUnit"></TD>
|
|
</TR><TR><TD height=8></TD> <TD></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1><Span ID="spnCityLabel">City:</Span></Font></TD>
|
|
<TD><Input Type="text" MaxLength="64" Size=42 Name="tbLocality"></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1><Span ID="spnStateLabel">State:</Span></Font></TD>
|
|
<TD><Input Type="text" MaxLength="64" Size=42 Name="tbState"></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1><Span ID="spnCountryLabel">Country:</Span></Font></TD>
|
|
<TD><Input Type="text" MaxLength="2" Size=2 Name="tbCountry"></TD>
|
|
</TR>
|
|
|
|
<!-- Stand-Alone Options -->
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Size=-1><B><BR>Extended Key Usage:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 height=2 BgColor=#008080></TD>
|
|
</TR><TR><TD colspan=3 height=6></TD>
|
|
</TR><TR><TD></TD>
|
|
<TD><SELECT Name="lbUsageOID" OnChange="handleUsageOID();">
|
|
<OPTION SELECTED Value="1.3.6.1.5.5.8.2.2"> IPSec
|
|
<OPTION Value="1.3.6.1.5.5.7.3.2"> Client Authentication
|
|
<OPTION Value="1.3.6.1.5.5.7.3.4"> E-Mail Protection
|
|
<OPTION Value="1.3.6.1.5.5.7.3.1"> Server Authentication
|
|
<OPTION Value="1.3.6.1.5.5.7.3.3"> Code Signing
|
|
<OPTION Value="1.3.6.1.5.5.7.3.8"> Time Stamp Signing
|
|
<OPTION Value="other"> other...
|
|
</SELECT></TD>
|
|
</TR>
|
|
|
|
<TR><TD Align=Right><Span ID=spnEKUOther1 Style="display:none"><Font size=-1>Usage OID:</Font></Span></TD>
|
|
<TD><Span ID=spnEKUOther2 Style="display:none"><Input Type="TEXT" Name="tbEKUOther" Value="1.3.6.1.5.5.7.3."></Span></TD>
|
|
</TR>
|
|
|
|
<!-- Enterprise Options -->
|
|
<!--
|
|
<TR>
|
|
<TD colspan=3><Font Size=-1><B><BR>Certificate Template:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 height=2 BgColor=#008080></TD>
|
|
</TR><TR><TD colspan=3 height=6></TD>
|
|
</TR><TR><TD></TD>
|
|
<TD><SELECT Name="lbCertTemplate">
|
|
< %
|
|
Dim nWriteTemplateResult
|
|
nWriteTemplateResult=WriteTemplateList()
|
|
% >
|
|
</SELECT></TD>
|
|
</TR>
|
|
-->
|
|
<!-- common -->
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Size=-1><B><BR>Cryptographic Service Provider Options:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 height=2 BgColor=#008080></TD>
|
|
</TR><TR><TD colspan=3 height=6></TD>
|
|
</TR>
|
|
|
|
<TR>
|
|
<TD Align=right><Font size=-1>CSP:</Font></TD>
|
|
<TD><SELECT Name="lbCSP">
|
|
<option>Loading...</Option>
|
|
</SELECT></TD>
|
|
</TR>
|
|
|
|
<TR><TD colspan=3 height=4></TD></TR>
|
|
<TR>
|
|
<TD Align=right ><Font size=-1>Key Size:</Font></TD>
|
|
<TD><Font size=-2><Input Type="TEXT" Name="tbKeySize" Value="512" MaxLength=4 size=4>
|
|
(common key sizes:
|
|
<A Href="" OnClick="document.UIForm.tbKeySize.value='512';return false;">512</a>,
|
|
<A Href="" OnClick="document.UIForm.tbKeySize.value='1024';return false;">1024</a>,
|
|
<A Href="" OnClick="document.UIForm.tbKeySize.value='2048';return false;">2048</a>,
|
|
<A Href="" OnClick="document.UIForm.tbKeySize.value='4096';return false;">4096</a>
|
|
)</Font></TD>
|
|
</TR>
|
|
|
|
|
|
<TR><TD colspan=3 height=4></TD></TR>
|
|
<TR>
|
|
<TD Align=right><Font size=-1>Hash Algorithm:</Font></TD>
|
|
<TD><Select Name="lbHashAlgorithm">
|
|
<Option Selected Value="SHA1"> SHA/RSA
|
|
<Option Value="1.3.14.3.2.13"> SHA/DSA
|
|
<Option Value="MD2"> MD2
|
|
<Option Value="MD5"> MD5
|
|
</Select></TD>
|
|
</TR>
|
|
|
|
<TR><TD colspan=3 height=4></TD></TR>
|
|
<TR>
|
|
<TD Align=right><Font size=-1>Key Spec:</Font></TD>
|
|
<TD><Font size=-1><Input Type="Radio" ID=rbKS1 Name="rbKeySpec" Value="1" CHECKED><Label for=rbKS1>Exchange</Label>
|
|
<Input Type="Radio" ID=rbKS2 Name="rbKeySpec" Value="2"><Label for=rbKS2>Signature</Label></Font></TD>
|
|
</TR>
|
|
|
|
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Size=-1><B><BR>Key Generation Options:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 height=2 BgColor=#008080></TD>
|
|
</TR><TR><TD colspan=3 height=6></TD>
|
|
</TR>
|
|
|
|
<TR><TD></TD>
|
|
<TD><Font size=-1><Input Type="Radio" ID=rbKG1 Name="rbKeyGen" Value="0" OnClick="handleKeyGen();" Checked><Label for=rbKG1>Create new key set</Label>
|
|
<Span Id="spnNewKeys">
|
|
<BR><IMG Src="certspc.gif" alt="" height=1 width=25><Input type="checkbox" Id=cbSetContainer name=cbSetContainer OnClick="handleSetContainer();"><Label for=cbSetContainer>Set the container name</Label>
|
|
<Span Id="spnNewContainer" Style="display:none">
|
|
<BR><IMG Src="certspc.gif" alt="" height=1 width=25>Container name:<Input Type="text" Name="tbNewContainerName" Size=20>
|
|
</Span>
|
|
</Span>
|
|
</Font></TD>
|
|
</TR><TR><TD></TD>
|
|
<TD><Font size=-1><Input Type="Radio" ID=rbKG2 Name="rbKeyGen" Value="1" OnClick="handleKeyGen();"><Label for=rbKG2>Use existing key set</Label>
|
|
<Span Id="spnExistingKeys" Style="display:none">
|
|
<BR><IMG Src="certspc.gif" alt="" height=1 width=25>Container name:<Input Type="text" Name="tbOldContainerName" Size=20>
|
|
</Span>
|
|
</Font></TD>
|
|
</TR>
|
|
|
|
<TR><TD colspan=3 height=4></TD></TR>
|
|
<TR>
|
|
<TD></TD>
|
|
<TD><Font size=-1><Input type="checkbox" Id=cbStrongKey name=cbStrongKey><Label for=cbStrongKey>Enable strong private key protection</Label></Font></TD>
|
|
</TR>
|
|
|
|
<TR><TD colspan=3 height=4></TD></TR>
|
|
<TR><TD></TD>
|
|
<TD><Font size=-1><Input Type="CHECKBOX" Name="cbMarkKeyExportable" ID=cbMarkKeyExportable OnClick="handleMarkExport();"><Label for=cbMarkKeyExportable>Mark keys as exportable</Label>
|
|
<Span Id="spnMarkKeyExportable" Style="display:none">
|
|
<BR><IMG Src="certspc.gif" alt="" height=1 width=25><Input Type="CHECKBOX" Name="cbExportKeys" ID=cbExportKeys OnClick="handleExportKeys();"><Label for=cbExportKeys>Export keys to file</Label>
|
|
<Span Id="spnExportKeys" Style="display:none">
|
|
<BR><IMG Src="certspc.gif" alt="" height=1 width=25>File name: <Input Type="text" Name="tbExportKeyFile" Size=20>
|
|
</Span>
|
|
</Span>
|
|
</Font></TD>
|
|
</TR>
|
|
|
|
<TR><TD colspan=3 height=4></TD></TR>
|
|
<TR><TD></TD>
|
|
<TD><Font size=-1><Input Type="CHECKBOX" Name="cbLocalMachineStore" ID=cbLocalMachineStore><Label for=cbLocalMachineStore>Use local machine store</Label></Font></TD>
|
|
</TR>
|
|
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Size=-1><B><BR>Additional Options:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 height=2 BgColor=#008080></TD>
|
|
</TR><TR><TD colspan=3 height=3></TD>
|
|
</TR>
|
|
|
|
<TR><TD colspan=3 height=6></TD>
|
|
</TR><TR>
|
|
<TD Align=right><Font size=-1>Attributes:</Font></TD>
|
|
<TD><TextArea Name="taAttrib" Wrap=off rows=4 cols=30></TextArea></TD>
|
|
</TR>
|
|
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Size=-1><B><BR>Output File Name:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 height=2 BgColor=#008080></TD>
|
|
</TR><TR><TD colspan=3 height=6></TD>
|
|
</TR><TR>
|
|
<TD Align=right></TD>
|
|
<TD><Input Type="text" MaxLength="64" Size=42 Name="tbFileName"></TD>
|
|
</TR>
|
|
|
|
</Table>
|
|
</P>
|
|
|
|
<!-- Green HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD></TR></Table>
|
|
<!-- White HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#FFFFFF><IMG Src="certspc.gif" alt="" height=5 width=1></TD></TR></Table>
|
|
|
|
<Table width=100% border=0 cellpadding=0 cellspacing=0><TR><TD align=right>
|
|
<INPUT type=button value="Generate and Save" OnClick="generateRequest();return false;">
|
|
|
|
</TD></TR></Table>
|
|
|
|
</Span>
|
|
<!-- #################### PAGE 3 #################### -->
|
|
<Span ID="spnPage3" Style="display:none">
|
|
|
|
|
|
<P> <B> Install An PKCS #7 Certificate </B>
|
|
<!-- Green HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD></TR></Table>
|
|
|
|
<P>
|
|
|
|
<Table Border=0 CellSpacing=0 CellPadding=0>
|
|
<TR> <!-- establish column widths. -->
|
|
<TD><IMG Src="certspc.gif" alt="" height=1 width=100></TD> <!-- label column, top border -->
|
|
<TD rowspan=59><IMG Src="certspc.gif" alt="" height=1 width=4></TD> <!-- label spacing column -->
|
|
<TD></TD> <!-- field column -->
|
|
</TR>
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Face="Arial" Size=-1><B>Saved Certificate:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD>
|
|
</TR><TR><TD colspan=3><IMG Src="certspc.gif" alt="" height=3 width=1></TD></TR>
|
|
|
|
<TR>
|
|
<TD Align=right><Font Face="Arial" size=-1><Span id=spPaste>Base64 Encoded <BR>PKCS #7 Certificate:</Span></Font></TD>
|
|
<TD><TEXTAREA rows=6 cols=40 name=taInstallCert wrap=off></TEXTAREA></TD>
|
|
</TR><TR><TD colspan=3 height=3></TD>
|
|
</TR><TR><TD></TD>
|
|
<TD>
|
|
<Font Face="Arial" Size=-1><A Href="#" onclick="BeginRead();blur();return false;"
|
|
OnMouseOver="window.status='Read a file';return true;" OnMouseOut="window.status='';return true;">Browse</A>
|
|
for a file to insert.</Font>
|
|
<Span id=spRead style="display:none">
|
|
<Table Border=0 CellSpacing=0 CellPadding=0>
|
|
<TR><TD Height=5></TD>
|
|
<TR>
|
|
<TD Width=6></TD>
|
|
<TD Width=3 BgColor=#008080></TD>
|
|
<TD Width=4></TD>
|
|
<TD>
|
|
File name: <Input Type="file" size=40 name=flRequest><BR>
|
|
<Input Type=Button Value="Read!" onClick="FinishRead();blur();" Style="font-weight:bold">
|
|
<Input Type=Button Value="Cancel" onClick="spRead.style.display='none';blur();">
|
|
|
|
</TD>
|
|
</TR>
|
|
</Table>
|
|
</Span>
|
|
</TD>
|
|
</TR>
|
|
|
|
<!-- Enterprise
|
|
<TR>
|
|
<TD colspan=3><Font Face="Arial" Size=-1><BR><B>Certificate Template:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD>
|
|
</TR><TR><TD colspan=3><IMG Src="certspc.gif" alt="" height=3 width=1></TD>
|
|
</TR><TR><TD></TD>
|
|
<TD><SELECT Name="lbCertTemplate">
|
|
< %
|
|
Dim nWriteTemplateResult
|
|
nWriteTemplateResult=WriteTemplateList()
|
|
% >
|
|
</SELECT></TD>
|
|
</TR>
|
|
-->
|
|
|
|
<TR>
|
|
<TD colspan=3><Font Face="Arial" Size=-1><BR><B>Additional Options:</B></Font></TD>
|
|
</TR><TR><TD colspan=3 BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD>
|
|
</TR><TR><TD colspan=3><IMG Src="certspc.gif" alt="" height=6 width=1></TD>
|
|
</TR>
|
|
|
|
<TR><TD colspan=3 height=4></TD></TR>
|
|
<TR><TD></TD>
|
|
<TD><Font size=-1><Input Type="CHECKBOX" Name="cbInstLocalMachineStore" ID=cbInstLocalMachineStore><Label for=cbInstLocalMachineStore>Use local machine store</Label></Font></TD>
|
|
</TR>
|
|
|
|
|
|
</Table>
|
|
<P>
|
|
|
|
|
|
<!-- Green HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#008080><IMG Src="certspc.gif" alt="" height=2 width=1></TD></TR></Table>
|
|
<!-- White HR --><Table border=0 cellspacing=0 cellpadding=0 width=100%><TR><TD BgColor=#FFFFFF><IMG Src="certspc.gif" alt="" height=5 width=1></TD></TR></Table>
|
|
|
|
<Table width=100% border=0 cellpadding=0 cellspacing=0><TR><TD align=right>
|
|
<INPUT type=Button id=btnInstall value="Install" style="width:.75in" OnClick="doInstall();return false;">
|
|
|
|
</TD></TR></Table>
|
|
|
|
|
|
</Span>
|
|
<!-- #################### SCRIPTS #################### -->
|
|
</Form>
|
|
</Font>
|
|
|
|
<Span id="spnIControl" style="display:none">
|
|
<!-- XEnroll will be inserted here -->
|
|
</Span>
|
|
|
|
<!-- A DHTML alert box -->
|
|
<Table border=0 cellspacing=0 cellpadding=0 ID="tblWorkingMsg" style="display:none; position:absolute;">
|
|
<TR>
|
|
<TD BgColor=#000040 height=3 colspan=3></TD>
|
|
</TR> <TR>
|
|
<TD BgColor=#000040 width=3></TD>
|
|
<TD BgColor=#008080><font Color=#FFFFFF><B><BR> <Span ID="spnWorkingMsg"></Span> <BR><BR></B></Font></TD>
|
|
<TD BgColor=#000040 width=3></TD>
|
|
</TR> <TR>
|
|
<TD BgColor=#000040 height=3 colspan=3></TD>
|
|
</TR>
|
|
</Table>
|
|
|
|
<Script Language=JavaScript>
|
|
|
|
//================================================================
|
|
// GLOBAL VARIABLES
|
|
|
|
var g_bIControlReady=false; // true when XEnroll is loaded and ready to go
|
|
|
|
// some constants defined in wincrypt.h:
|
|
var CRYPT_EXPORTABLE=1;
|
|
var CRYPT_USER_PROTECTED=2;
|
|
var CRYPT_MACHINE_KEYSET=0x20;
|
|
var AT_KEYEXCHANGE=1;
|
|
var AT_SIGNATURE=2;
|
|
var CERT_SYSTEM_STORE_LOCATION_SHIFT=16;
|
|
var CERT_SYSTEM_STORE_LOCAL_MACHINE_ID=2;
|
|
var CERT_SYSTEM_STORE_LOCAL_MACHINE=CERT_SYSTEM_STORE_LOCAL_MACHINE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT;
|
|
|
|
//================================================================
|
|
// SCRIPTS COMMON TO ALL PAGES
|
|
|
|
//----------------------------------------------------------------
|
|
// reset the page to the begining
|
|
function goHome() {
|
|
spnPage1.style.display="";
|
|
spnPage2.style.display="none";
|
|
spnPage3.style.display="none";
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// XEnroll only allows us to set the CSP once.
|
|
// So, if something goes wrong in certificate creation,
|
|
// we need a new XEnroll before we can try again
|
|
// Thus, we use a script to reincarnate it.
|
|
function recreateIControl() {
|
|
g_bIControlReady=false;
|
|
spnIControl.innerHTML="";
|
|
spnIControl.innerHTML="<OBJECT"
|
|
+ " classid=\"clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1\""
|
|
//+ " codebase=\"/CertControl/xenroll.cab#Version=5,131,1837,1\""
|
|
+ " id=IControl"
|
|
+ "> </OBJECT>";
|
|
g_bIControlReady=true;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// This contains the functions we want executed immediately after load completes
|
|
function postLoad() {
|
|
var nResult;
|
|
|
|
// We're not ready to go yet
|
|
g_bIControlReady=false;
|
|
|
|
// Load an XEnroll object into the page
|
|
recreateIControl();
|
|
|
|
// get the CSP list
|
|
showTransientMessage("Getting CSP list");
|
|
setTimeout("postLoadPhase2();",1); } function postLoadPhase2() {
|
|
|
|
nResult=GetCSPList();
|
|
hideTransientMessage();
|
|
if (0!=nResult) {
|
|
handleLoadError(nResult, "CSP");
|
|
return;
|
|
}
|
|
|
|
// enterprise stuff
|
|
//< % If "StandAlone"<>sCSType And 0<>nWriteTemplateResult Then % >
|
|
//handleLoadError(< % =nWriteTemplateResult % >, "certificate template");
|
|
//< % End If % >
|
|
|
|
// Now we're ready to go
|
|
g_bIControlReady=true;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// handle errors from GetCSPList()
|
|
function handleLoadError(nResult, sList) {
|
|
if (-1==nResult) {
|
|
alert("An unexpected error occurred while"
|
|
+" getting the "+sList+" list:\nNo "+sList+"s could be found!");
|
|
} else {
|
|
alert("An unexpected error (0x"+toHex(nResult)+") occurred while"
|
|
+" getting the "+sList+" list.");
|
|
}
|
|
document.UIForm.btnNext1.disabled=true;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// show the message in the status bar and in the middle of the screen
|
|
function showTransientMessage(sMessage) {
|
|
window.status=sMessage;
|
|
spnWorkingMsg.innerText=sMessage;
|
|
tblWorkingMsg.style.display='';
|
|
tblWorkingMsg.style.pixelTop=
|
|
(document.body.clientHeight/2)-(tblWorkingMsg.offsetHeight/2)+(document.body.scrollTop);
|
|
//alert("w: d.b.cw:"+document.body.clientWidth+" m.ow:"+tblWorkingMsg.offsetWidth+" d.b.sl:"+document.body.scrollLeft);
|
|
tblWorkingMsg.style.pixelLeft=
|
|
(document.body.clientWidth/2)-(tblWorkingMsg.offsetWidth/2)+(document.body.scrollLeft);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// hide the message box
|
|
function hideTransientMessage() {
|
|
window.status="";
|
|
tblWorkingMsg.style.display='none';
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// throw up a confirmation dialog
|
|
function myConfirm(sPrompt) {
|
|
return confirm(sPrompt);
|
|
}
|
|
|
|
//================================================================
|
|
// SCRIPTS FOR PAGE 1
|
|
|
|
//----------------------------------------------------------------
|
|
// this function is called from the first page to dispatch
|
|
function goNext() {
|
|
|
|
// make sure XEnroll is ready before continuing
|
|
if (false==g_bIControlReady) {
|
|
alert("This page has not finished loading yet. Please wait a few seconds and try again.");
|
|
return;
|
|
}
|
|
|
|
// go to the page the user selected
|
|
spnPage1.style.display="none";
|
|
if (document.UIForm.rbgrpAction[0].checked) {
|
|
spnPage2.style.display="";
|
|
} else {
|
|
spnPage3.style.display="";
|
|
}
|
|
}
|
|
|
|
//================================================================
|
|
// SCRIPTS FOR PAGE 2
|
|
|
|
//----------------------------------------------------------------
|
|
// Morph routine
|
|
function handleUsageOID() {
|
|
if ("other"==document.UIForm.lbUsageOID.options[document.UIForm.lbUsageOID.selectedIndex].value) {
|
|
spnEKUOther1.style.display='';
|
|
spnEKUOther2.style.display='';
|
|
document.UIForm.lbUsageOID.blur();
|
|
document.UIForm.tbEKUOther.select();
|
|
document.UIForm.tbEKUOther.focus();
|
|
} else {
|
|
spnEKUOther1.style.display='none';
|
|
spnEKUOther2.style.display='none';
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// Morph routine
|
|
function handleSaveReq() {
|
|
if (document.UIForm.cbSaveRequest.checked) {
|
|
spnSaveRequest.style.display='';
|
|
} else {
|
|
spnSaveRequest.style.display='none';
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// Morph routine
|
|
function handleMarkExport() {
|
|
if (document.UIForm.cbMarkKeyExportable.checked) {
|
|
spnMarkKeyExportable.style.display='';
|
|
} else {
|
|
spnMarkKeyExportable.style.display='none';
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// Morph routine
|
|
function handleExportKeys() {
|
|
if (document.UIForm.cbExportKeys.checked) {
|
|
spnExportKeys.style.display='';
|
|
} else {
|
|
spnExportKeys.style.display='none';
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// Morph routine
|
|
function handleKeyGen() {
|
|
if (document.UIForm.rbKeyGen[0].checked) {
|
|
spnNewKeys.style.display='';
|
|
spnExistingKeys.style.display='none';
|
|
} else {
|
|
spnNewKeys.style.display='none';
|
|
spnExistingKeys.style.display='';
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// Morph routine
|
|
function handleSetContainer() {
|
|
if (document.UIForm.cbSetContainer.checked) {
|
|
spnNewContainer.style.display='';
|
|
} else {
|
|
spnNewContainer.style.display='none';
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// make sure the given string is valid
|
|
function isValidX500String(sSource) {
|
|
if (//""==sSource || //On advanced page, we allow blank entries
|
|
-1!=sSource.indexOf(",",0) ||
|
|
-1!=sSource.indexOf("\"",0) ||
|
|
-1!=sSource.indexOf("+",0) ||
|
|
-1!=sSource.indexOf(";",0)) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// check for invalid characters and empty strings
|
|
function isValidIA5String(sSource) {
|
|
var nIndex;
|
|
for (nIndex=sSource.length-1; nIndex>=0; nIndex--) {
|
|
if (sSource.charCodeAt(nIndex)>127) { // NOTE: this is better, but not compatible with old browsers.
|
|
return false;
|
|
}
|
|
};
|
|
return true;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// check for invalid characters
|
|
function isValidCountryField(tbCountry) {
|
|
tbCountry.value=tbCountry.value.toUpperCase();
|
|
var sSource=tbCountry.value;
|
|
var nIndex, ch;
|
|
if (sSource.length!=2 && sSource.length!=0) {
|
|
return false;
|
|
}
|
|
for (nIndex=sSource.length-1; nIndex>=0; nIndex--) {
|
|
ch=sSource.charAt(nIndex)
|
|
if (ch<"A" || ch>"Z") {
|
|
return false;
|
|
}
|
|
};
|
|
return true;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// set a label to normal style
|
|
function markLabelNormal(spn) {
|
|
spn.style.color="#000000";
|
|
spn.style.fontWeight='normal';
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// set a label to error state
|
|
function markLabelError(spn) {
|
|
spn.style.color='#FF0000';
|
|
spn.style.fontWeight='bold';
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
// check that the form has data in it
|
|
function validateRequest() {
|
|
markLabelNormal(spnNameLabel);
|
|
markLabelNormal(spnEmailLabel);
|
|
markLabelNormal(spnCompanyLabel);
|
|
markLabelNormal(spnDepartmentLabel);
|
|
markLabelNormal(spnCityLabel);
|
|
markLabelNormal(spnStateLabel);
|
|
markLabelNormal(spnCountryLabel);
|
|
|
|
var bOK=true;
|
|
var fldFocusMe=null;
|
|
|
|
// check in 'reverse' order so that focus gets set to last item
|
|
// don't set focus immediately because we'd get funny scrolling effects.
|
|
|
|
if (false==isValidCountryField(document.UIForm.tbCountry)) {
|
|
bOK=false;
|
|
fldFocusMe=document.UIForm.tbCountry;
|
|
markLabelError(spnCountryLabel);
|
|
}
|
|
if (false==isValidX500String(document.UIForm.tbState.value)) {
|
|
bOK=false;
|
|
fldFocusMe=document.UIForm.tbState;
|
|
markLabelError(spnStateLabel);
|
|
}
|
|
if (false==isValidX500String(document.UIForm.tbLocality.value)) {
|
|
bOK=false;
|
|
fldFocusMe=document.UIForm.tbLocality;
|
|
markLabelError(spnCityLabel);
|
|
}
|
|
if (false==isValidX500String(document.UIForm.tbOrgUnit.value)) {
|
|
bOK=false;
|
|
fldFocusMe=document.UIForm.tbOrgUnit;
|
|
markLabelError(spnDepartmentLabel);
|
|
}
|
|
if (false==isValidX500String(document.UIForm.tbOrg.value)) {
|
|
bOK=false;
|
|
fldFocusMe=document.UIForm.tbOrg;
|
|
markLabelError(spnCompanyLabel);
|
|
}
|
|
if (false==isValidX500String(document.UIForm.tbEmail.value) || false==isValidIA5String(document.UIForm.tbEmail.value)) {
|
|
bOK=false;
|
|
fldFocusMe=document.UIForm.tbEmail;
|
|
markLabelError(spnEmailLabel);
|
|
}
|
|
if (false==isValidX500String(document.UIForm.tbCommonName.value)) {
|
|
bOK=false;
|
|
fldFocusMe=document.UIForm.tbCommonName;
|
|
markLabelError(spnNameLabel);
|
|
}
|
|
if (false==bOK) {
|
|
spnFixTxt.style.display='';
|
|
window.scrollTo(0,0);
|
|
fldFocusMe.focus();
|
|
}
|
|
|
|
// validity check on the key size
|
|
if (true==bOK) {
|
|
var nKeySize=parseInt(document.UIForm.tbKeySize.value);
|
|
var sMessage;
|
|
if (isNaN(nKeySize)) {
|
|
sMessage="Please enter a number for the key size.";
|
|
bOK=false;
|
|
} else if (nKeySize<512 || nKeySize>4096) {
|
|
sMessage="Please enter a valid number for the key size. The key size must be between 512 and 4096.";
|
|
bOK=false;
|
|
}
|
|
if (false==bOK) {
|
|
alert (sMessage);
|
|
document.UIForm.tbKeySize.focus();
|
|
}
|
|
}
|
|
|
|
// Check the container name
|
|
if (true==bOK) {
|
|
if (document.UIForm.rbKeyGen[0].checked) {
|
|
// new keyset
|
|
if (document.UIForm.cbSetContainer.checked) {
|
|
if (""==document.UIForm.tbNewContainerName.value) {
|
|
bOK=false;
|
|
}
|
|
}
|
|
} else {
|
|
// existing keyset
|
|
if (""==document.UIForm.tbOldContainerName.value) {
|
|
bOK=false;
|
|
}
|
|
}
|
|
if (false==bOK) {
|
|
alert ("Please enter a key container name.");
|
|
if (document.UIForm.rbKeyGen[0].checked) {
|
|
document.UIForm.tbNewContainerName.focus();
|
|
} else {
|
|
document.UIForm.tbOldContainerName.focus();
|
|
}
|
|
}
|
|
}
|
|
|
|
// validity check on the file name
|
|
if (true==bOK) {
|
|
if (""==document.UIForm.tbFileName.value) {
|
|
alert ("Please enter a file name.");
|
|
document.UIForm.tbFileName.focus();
|
|
bOK=false;
|
|
}
|
|
}
|
|
|
|
return bOK;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
function generateRequest() {
|
|
|
|
// check that the form is filled in
|
|
spnErrorTxt.style.display='none';
|
|
spnFixTxt.style.display='none';
|
|
if (false==validateRequest()) {
|
|
return;
|
|
}
|
|
|
|
// show a nice message since request creation can take a while
|
|
showTransientMessage("Generating Request...");
|
|
|
|
// Make the message show up on the screen,
|
|
// then continue with 'generateRequest':
|
|
// Pause 1 mS before executing phase 2,
|
|
// so screen will have time to repaint.
|
|
setTimeout("generateRequestPhase2();",1); } function generateRequestPhase2() {
|
|
|
|
// set the identifying info
|
|
var sDistinguishedName=""
|
|
+ "C="+document.UIForm.tbCountry.value +";"
|
|
+ "S="+document.UIForm.tbState.value +";"
|
|
+ "L="+document.UIForm.tbLocality.value +";"
|
|
+ "O="+document.UIForm.tbOrg.value +";"
|
|
+"OU="+document.UIForm.tbOrgUnit.value +";"
|
|
+ "E="+document.UIForm.tbEmail.value +";"
|
|
+"CN="+document.UIForm.tbCommonName.value+";";
|
|
|
|
//
|
|
// Stand-Alone Options
|
|
//
|
|
|
|
// set the extended key usage and certificate request 'friendly type'
|
|
var nUsageIndex=document.UIForm.lbUsageOID.selectedIndex;
|
|
var sCertUsage;
|
|
if ("other"==document.UIForm.lbUsageOID.options[nUsageIndex].value) {
|
|
sCertUsage=document.UIForm.tbEKUOther.value;
|
|
} else {
|
|
sCertUsage=document.UIForm.lbUsageOID.options[nUsageIndex].value;
|
|
}
|
|
|
|
//
|
|
// Enterprise Options
|
|
//
|
|
|
|
// get the selected template
|
|
//var nTemplateIndex=document.UIForm.lbCertTemplate.selectedIndex;
|
|
//var sTemplate=document.UIForm.lbCertTemplate.options[nTemplateIndex].value;
|
|
|
|
// extract the template type (the first char)
|
|
// X-bad, U-user, M-machine
|
|
//var sTemplateType=sTemplate.substring(0,1);
|
|
//sTemplate=sTemplate.slice(1);
|
|
|
|
// set the cert template
|
|
//IControl.addCertTypeToRequest(sTemplate);
|
|
|
|
//var sCertUsage=""; // ignored
|
|
|
|
|
|
//
|
|
// CSP Options subheading:
|
|
//
|
|
|
|
// set the CSP
|
|
var nCSPIndex=document.UIForm.lbCSP.selectedIndex;
|
|
IControl.ProviderName=document.UIForm.lbCSP.options[nCSPIndex].text;
|
|
IControl.ProviderType=document.UIForm.lbCSP.options[nCSPIndex].value;
|
|
|
|
// set the key size (the upper 16 bits of GenKeyFlags)
|
|
// note: this value has already been validated
|
|
var nKeySize=parseInt(document.UIForm.tbKeySize.value);
|
|
IControl.GenKeyFlags=nKeySize<<16;
|
|
|
|
// set the KeySpec
|
|
if (document.UIForm.rbKeySpec[0].checked) {
|
|
IControl.KeySpec=AT_KEYEXCHANGE;
|
|
} else {
|
|
IControl.KeySpec=AT_SIGNATURE;
|
|
}
|
|
|
|
// set the hash algorithm
|
|
var nHashIndex=document.UIForm.lbHashAlgorithm.selectedIndex;
|
|
IControl.HashAlgorithm=document.UIForm.lbHashAlgorithm.options[nHashIndex].value;
|
|
|
|
//
|
|
// Key Generation Options subheading:
|
|
//
|
|
|
|
// set the 'use existing key set' flag
|
|
if (document.UIForm.rbKeyGen[0].checked) {
|
|
IControl.UseExistingKeySet=false;
|
|
if (document.UIForm.cbSetContainer.checked) {
|
|
IControl.ContainerName=document.UIForm.tbNewContainerName.value;
|
|
}
|
|
} else {
|
|
IControl.UseExistingKeySet=true;
|
|
IControl.ContainerName=document.UIForm.tbOldContainerName.value;
|
|
}
|
|
|
|
// set 'Strong private key protection'
|
|
// note: upper 16 bits already set as key size
|
|
if (document.UIForm.cbStrongKey.checked) {
|
|
IControl.GenKeyFlags|=CRYPT_USER_PROTECTED;
|
|
}
|
|
|
|
// mark the keys as exportable
|
|
if (document.UIForm.cbMarkKeyExportable.checked) {
|
|
IControl.GenKeyFlags|=CRYPT_EXPORTABLE;
|
|
|
|
// set the key export file (.pvk)
|
|
if (document.UIForm.cbExportKeys.checked) {
|
|
IControl.PVKFileName=document.UIForm.tbExportKeyFile.value;
|
|
}
|
|
}
|
|
|
|
// place the keys in the local machine store
|
|
if (document.UIForm.cbLocalMachineStore.checked) {
|
|
|
|
// the keys attached to the dummy request cert go in the local machine store
|
|
IControl.RequestStoreFlags=CERT_SYSTEM_STORE_LOCAL_MACHINE;
|
|
|
|
// used in CryptAcquireContext
|
|
IControl.ProviderFlags=CRYPT_MACHINE_KEYSET;
|
|
}
|
|
|
|
//
|
|
// Additional Options subheading:
|
|
// File Name subheading:
|
|
//
|
|
|
|
// get any extra attributes
|
|
var sAttrib=document.UIForm.taAttrib.value;
|
|
|
|
// get the file name
|
|
var sFileName=document.UIForm.tbFileName.value;
|
|
|
|
//
|
|
// Build and save the certificate request
|
|
//
|
|
|
|
// build and save the certificate request
|
|
// ask VB to do it, since it can handle errors
|
|
nResult=CreateAndSaveRequest(sDistinguishedName, sCertUsage, sAttrib, sFileName);
|
|
|
|
// hide the message box
|
|
hideTransientMessage();
|
|
|
|
// deal with an error if there was one
|
|
if (0!=nResult) {
|
|
handleError(nResult);
|
|
} else {
|
|
alert("The request was generated and saved.");
|
|
goHome();
|
|
}
|
|
|
|
// reincarnate XEnroll
|
|
recreateIControl();
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
function handleError(nResult) {
|
|
var sSugCause="No suggestion.";
|
|
var sErrorName="(unknown)";
|
|
// analyze the error - funny use of XOR ('^') because obvious choice '==' doesn't work
|
|
if (0==(0x80090008^nResult)) {
|
|
sErrorName="NTE_BAD_ALGID";
|
|
sSugCause="The CSP you chose was unable to process the request. Try a different CSP.";
|
|
} else if (0==(0x80090016^nResult)) {
|
|
sErrorName="NTE_BAD_KEYSET";
|
|
if (document.UIForm.rbKeyGen[0].checked) {
|
|
sSugCause="The CSP you chose was unable to process the request. Try a different CSP.";
|
|
} else {
|
|
sSugCause="Either the key container you specified does not exist, or the CSP you chose was unable to process the request. Enter the name of an existing key container; choose 'Create new keyset'; or try a different CSP.";
|
|
}
|
|
} else if (0==(0x80090019^nResult)) {
|
|
sErrorName="NTE_KEYSET_NOT_DEF";
|
|
sSugCause="The CSP you chose was unable to process the request. Try a different CSP.";
|
|
} else if (0==(0x80090020^nResult)) {
|
|
sErrorName="NTE_FAIL";
|
|
sSugCause="The CSP you chose was unable to process the request. Try a different CSP.";
|
|
} else if (0==(0x80090009^nResult)) {
|
|
sErrorName="NTE_BAD_FLAGS";
|
|
sSugCause="The CSP you chose does not support one or more of the settings"
|
|
+ " you have made, such as key size, key spec, hash algorithm, etc."
|
|
+ " Try using different settings or a different CSP.";
|
|
} else if (0==(0x8009000F^nResult)) {
|
|
sErrorName="NTE_EXISTS";
|
|
sSugCause="The container you named already exists. When creating a new key,"
|
|
+ " you must use a new container name.";
|
|
} else if (0==(0x80092002^nResult)) {
|
|
sErrorName="CRYPT_E_BAD_ENCODE";
|
|
//sSugCause="";
|
|
} else if (0==(0x80092022^nResult)) {
|
|
sErrorName="CRYPT_E_INVALID_IA5_STRING";
|
|
sSugCause="You entered an invalid character. Report a bug, because this"
|
|
+ " should have been caught in validation.";
|
|
} else if (0==(0x80092023^nResult)) {
|
|
sErrorName="CRYPT_E_INVALID_X500_STRING";
|
|
sSugCause="You entered an invalid character. Report a bug, because this"
|
|
+ " should have been caught in validation.";
|
|
} else if (0==(0x80070003^nResult)) {
|
|
sErrorName="ERROR_PATH_NOT_FOUND";
|
|
sSugCause="The file name you entered is invalid.";
|
|
} else if (0==(0x8000FFFF^nResult)) {
|
|
sErrorName="E_UNEXPECTED";
|
|
} else if (58==nResult) {
|
|
sErrorName="File already exists";
|
|
sSugCause="The file already exists and you chose not to overwrite it. The certificate was not saved.";
|
|
}
|
|
|
|
// modify the document text and appearance to show the error message
|
|
spnErrorNum.innerText="0x"+toHex(nResult)+" - "+sErrorName;
|
|
spnErrorMsg.innerText=sSugCause;
|
|
spnErrorTxt.style.display='';
|
|
|
|
// back to the top so the messages show
|
|
window.scrollTo(0,0);
|
|
|
|
}
|
|
|
|
//================================================================
|
|
// SCRIPTS FOR PAGE 3
|
|
|
|
//----------------------------------------------------------------
|
|
function BeginRead() {
|
|
spRead.style.display='';
|
|
document.UIForm.flRequest.focus()
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
function FinishRead() {
|
|
if (""==document.UIForm.flRequest.value) {
|
|
handleReadError(5);
|
|
return;
|
|
}
|
|
var nResult=GetFileData(); // use VBScript to read the file, since it can handle errors
|
|
if (0!=nResult) {
|
|
handleReadError(nResult);
|
|
return;
|
|
}
|
|
spRead.style.display='none';
|
|
document.UIForm.btnInstall.focus()
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
function handleReadError(nResult) {
|
|
var sMessage="An unexpected error occured.";
|
|
var sErrorName="(unknown)";
|
|
var elemFocusMe=null;
|
|
if (429==nResult) {
|
|
sMessage="Your web browser security settings prohibit this page"
|
|
+ "from accessing your disk. The file cannot be read.\n"
|
|
+ "Possible solutions:\n"
|
|
+ " - Paste the data in yourself.\n"
|
|
+ " - Add this page to your browser's list of trusted sites.";
|
|
sErrorName="ActiveX component can't create object"
|
|
elemFocusMe=document.UIForm.flRequest;
|
|
} else if (53==nResult) {
|
|
sMessage="The file you specified was not found. Please enter a valid file name.";
|
|
sErrorName="File not found"
|
|
elemFocusMe=document.UIForm.flRequest;
|
|
} else if (5==nResult) {
|
|
sMessage="Please enter a file name.";
|
|
sErrorName="Invalid argument"
|
|
elemFocusMe=document.UIForm.flRequest;
|
|
} else if (0!=nResult) {
|
|
sMessage="An unexpected error occurred while trying to read the file.\n\nError: "+nResult;
|
|
}
|
|
|
|
|
|
alert(sMessage);
|
|
|
|
// place focus on offending control
|
|
if (null!=elemFocusMe) {
|
|
elemFocusMe.focus();
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
function doInstall() {
|
|
|
|
// get the cert, and make sure it's not empty
|
|
var sPKCS7=document.UIForm.taInstallCert.value;
|
|
if (""==sPKCS7) {
|
|
alert("Please place a base64-encoded certificate in the field.");
|
|
return;
|
|
}
|
|
|
|
// check for the begin/end tags
|
|
if (-1==sPKCS7.indexOf("-----BEGIN CERTIFICATE-----") ||
|
|
-1==sPKCS7.indexOf("-----END CERTIFICATE-----")) {
|
|
if (false==confirm("The PKCS #7 certificate should contain\na 'BEGIN' and"
|
|
+" an 'END' tag, but it does not.\n\n"
|
|
+"Are you sure you want to install this certificate?")) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// place the keys in the local machine store?
|
|
if (document.UIForm.cbInstLocalMachineStore.checked) {
|
|
|
|
// the keys attached to the final cert also go in the local machine store
|
|
IControl.MyStoreFlags=CERT_SYSTEM_STORE_LOCAL_MACHINE;
|
|
IControl.RequestStoreFlags=CERT_SYSTEM_STORE_LOCAL_MACHINE;
|
|
}
|
|
|
|
// install the cert
|
|
var nResult=InstallCert(sPKCS7);
|
|
|
|
// check for errors
|
|
if(0==nResult) {
|
|
alert("Your new certificate has been successfully installed.");
|
|
goHome();
|
|
} else {
|
|
var sMessage="Unable to install the certificate:\n"
|
|
+"Please verify that your CSP supports any settings you have made "
|
|
+"and that your input is valid.\n\n"
|
|
+"Error: 0x"+toHex(nResult);
|
|
|
|
// funny use of XOR ('^') because obvious choice '==' doesn't work
|
|
if (0==(0x80092004^nResult)) {
|
|
sMessage="Unable to install the certificate:\n"
|
|
+"The system could not find the keyset associated with this certificate."
|
|
+" This cert may have already been installed,"
|
|
+" or the keyset may be in a different store from the one you selected.\n\n"
|
|
+"Error: 0x80092004 - CRYPT_E_NOT_FOUND";
|
|
}
|
|
|
|
alert(sMessage);
|
|
}
|
|
|
|
// reincarnate XEnroll
|
|
recreateIControl();
|
|
|
|
}
|
|
|
|
</Script>
|
|
<Script Language=VBScript>
|
|
Option Explicit
|
|
|
|
'/================================================================
|
|
'/ SCRIPTS COMMON TO ALL PAGES
|
|
|
|
'/----------------------------------------------------------------
|
|
'/ Get the list of CSPs from XEnroll
|
|
'/ returns error number
|
|
'/ assumes XEnroll is named 'IControl' and the list box is 'document.UIForm.lbCSP'
|
|
Function GetCSPList()
|
|
On Error Resume Next
|
|
Dim nProvType, nOrigProvType, nTotCSPs, nDefaultCSP
|
|
Const nMaxProvType=25 ' should be >= the number of providers defined in wincrypt.h (~line 431)
|
|
nTotCSPs=0
|
|
nDefaultCSP=-1
|
|
|
|
' save the original provider type
|
|
nOrigProvType=IControl.ProviderType
|
|
If 0<>Err.number Then
|
|
' something wrong with IControl
|
|
GetCSPList=Err.Number
|
|
Exit Function
|
|
End If
|
|
|
|
' enumerate through each of the provider types
|
|
For nProvType=0 To nMaxProvType
|
|
Dim nCSPIndex
|
|
nCSPIndex=0
|
|
IControl.ProviderType=nProvType
|
|
|
|
' enumerate through each of the providers for this type
|
|
Do
|
|
Dim sProviderName
|
|
|
|
'get the name
|
|
sProviderName=IControl.enumProviders(nCSPIndex, 0)
|
|
|
|
If &H80070103=Err.number Then
|
|
' no more providers
|
|
Err.Clear
|
|
Exit Do
|
|
End If
|
|
|
|
' For each provider, add an element to the list box.
|
|
Dim oOption
|
|
Set oOption=document.createElement("OPTION")
|
|
oOption.text=sProviderName
|
|
oOption.Value=nProvType
|
|
document.UIForm.lbCSP.add(oOption)
|
|
If InStr(sProviderName, "Microsoft Base Cryptographic Provider") <> 0 Then
|
|
oOption.selected=True
|
|
nDefaultCSP=nTotCSPs
|
|
End If
|
|
nTotCSPs=nTotCSPs+1
|
|
|
|
' get the next provider
|
|
nCSPIndex=nCSPIndex+1
|
|
Loop
|
|
Next
|
|
|
|
' if there are no CSPs, we're kinda stuck
|
|
If 0=nTotCSPs Then
|
|
Set oElement=document.createElement("OPTION")
|
|
oElement.text="(no CSPs found)"
|
|
document.UIForm.lbCSP.Options.Add oElement
|
|
End If
|
|
|
|
' remove the 'loading' text
|
|
document.UIForm.lbCSP.remove(0)
|
|
|
|
' select the default provider
|
|
If -1<>nDefaultCSP Then
|
|
document.UIForm.lbCSP.selectedIndex=nDefaultCSP
|
|
End If
|
|
|
|
' restore the original provider type
|
|
IControl.ProviderType=nOrigProvType
|
|
|
|
' set the return value and exit
|
|
If 0<>Err.Number Then
|
|
GetCSPList=Err.Number
|
|
ElseIf 0=nTotCSPs Then
|
|
' signal no elements with -1
|
|
GetCSPList=-1
|
|
Else
|
|
GetCSPList=0
|
|
End If
|
|
|
|
End Function
|
|
|
|
'/----------------------------------------------------------------
|
|
'/ Convert a number to a hex string (JavaScript doesn't have this)
|
|
Function toHex(number)
|
|
toHex=Hex(number)
|
|
End Function
|
|
|
|
'/================================================================
|
|
'/ SCRIPTS FOR PAGE 2
|
|
|
|
'/----------------------------------------------------------------
|
|
Function CreateRequest(sDistinguishedName, sCertUsage)
|
|
On Error Resume Next
|
|
document.SubmittedData.CertRequest.value = _
|
|
IControl.CreatePKCS10(sDistinguishedName, sCertUsage)
|
|
CreateRequest=Err.number
|
|
End Function
|
|
|
|
'/----------------------------------------------------------------
|
|
Function CreateAndSaveRequest(sDistinguishedName, sCertUsage, sAttrib, sFileName)
|
|
On Error Resume Next
|
|
Dim sPKCS10
|
|
|
|
' first, create the PKCS10
|
|
sPKCS10=IControl.CreatePKCS10(sDistinguishedName, sCertUsage)
|
|
If 0<>Err.Number Then
|
|
CreateAndSaveRequest=Err.number
|
|
Exit Function
|
|
End If
|
|
|
|
' prepend the attribs and wrap in begin/end tags
|
|
sPKCS10=sAttrib & vbNewLine & "-----BEGIN NEW CERTIFICATE REQUEST-----" & vbNewLine & _
|
|
sPKCS10 & "-----END NEW CERTIFICATE REQUEST-----" & vbNewLine
|
|
|
|
showTransientMessage("Saving request...")
|
|
|
|
' save the file
|
|
CreateAndSaveRequest=WriteFileData(sFileName, sPKCS10)
|
|
If 0<>Err.Number Then
|
|
CreateAndSaveRequest=Err.number
|
|
End If
|
|
|
|
End Function
|
|
|
|
'/----------------------------------------------------------------
|
|
'/ Write the give strign to the given file,
|
|
'/ prompting to overwrite if necessary
|
|
Function WriteFileData(sFileName, sData)
|
|
Dim filesystem, file
|
|
On Error Resume Next
|
|
|
|
' First, create the FileSystem object
|
|
Set filesystem = CreateObject("Scripting.FileSystemObject")
|
|
' Security may not allow this
|
|
If Err.number<>0 Then
|
|
WriteFileData=Err.number
|
|
Exit Function
|
|
End If
|
|
|
|
' check for existing file
|
|
Dim bExists
|
|
bExists=filesystem.FileExists(sFileName)
|
|
If 0<>Err.Number Then
|
|
WriteFileData=Err.number
|
|
Exit Function
|
|
End If
|
|
If True=bExists Then
|
|
'file exists. Overwrite?
|
|
If False=myConfirm("The file '" & sFileName & "' already exists. Overwrite?") Then
|
|
WriteFileData=58 'File Already Exists
|
|
Exit Function
|
|
End If
|
|
End If
|
|
|
|
' open the specified file
|
|
Set file=filesystem.OpenTextFile(sFileName, 2, true) '2->ForWriting, true->create
|
|
If Err.Number<>0 Then
|
|
WriteFileData=Err.number
|
|
Exit Function
|
|
End If
|
|
|
|
' read the data and stash it into the form
|
|
file.Write sData
|
|
' catch any read errors
|
|
If Err.Number<>0 Then
|
|
WriteFileData=Err.number
|
|
Exit Function
|
|
End If
|
|
|
|
' clean up
|
|
file.Close
|
|
Set file=Nothing
|
|
Set filesystem=Nothing
|
|
WriteFileData=0
|
|
End Function
|
|
|
|
'/================================================================
|
|
'/ SCRIPTS FOR PAGE 3
|
|
|
|
'/----------------------------------------------------------------
|
|
'/ Read the data from the file listed in UIForm.flRequest and place
|
|
'/ it in UIForm.taInstallCert
|
|
Function GetFileData()
|
|
Dim filesystem, file
|
|
On Error Resume Next
|
|
|
|
' First, create the FileSystem object
|
|
Set filesystem = CreateObject("Scripting.FileSystemObject")
|
|
' Security may not allow this
|
|
If Err.number<>0 Then
|
|
GetFileData=Err.number
|
|
Exit Function
|
|
End If
|
|
|
|
' open the specified file
|
|
Set file=filesystem.OpenTextFile(document.UIForm.flRequest.value, 1 , false) '1->ForReading, false->don't create
|
|
' file may not exist
|
|
If Err.number<>0 Then
|
|
GetFileData=Err.number
|
|
Exit Function
|
|
End If
|
|
|
|
' read the data and stash it into the form
|
|
document.UIForm.taInstallCert.value=file.ReadAll
|
|
' catch any read errors
|
|
If Err.number<>0 Then
|
|
GetFileData=Err.number
|
|
Exit Function
|
|
End If
|
|
|
|
' clean up
|
|
file.Close
|
|
Set file=Nothing
|
|
Set filesystem=Nothing
|
|
GetFileData=0
|
|
End Function
|
|
|
|
'/----------------------------------------------------------------
|
|
'/ Call XEnroll to install the given cert
|
|
Function InstallCert(sPKCS7)
|
|
On Error Resume Next
|
|
IControl.AcceptPKCS7(sPKCS7)
|
|
InstallCert=Err.Number
|
|
End Function
|
|
|
|
</SCRIPT>
|
|
|
|
</Script>
|
|
|
|
<!-- \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ -->
|
|
|
|
|
|
</Body>
|
|
</HTML>
|