Just want to say thanks to all for the help getting my IIS server to accept
my self signed CA.
Here is a script to create user certs.
# This script takes html form data and generates a pem encoded certificate
reque
st.
#created by Tom Hash
MAIN: {
require "cgi-lib.pl";
use Expect;
#read in all the variables set by the form
&ReadParse(*input);
$organization = "Changeme"; # hard code the Org field
$organization_unit = ""; # changed below
$new_state = ""; # state in case counrty us different from US
# Check to see if all the right fields are filled in
# And if they have requested a cert in the past.
if ( -f "/var/www/cgi-bin/temp/$input{'email'}.p12") {
&CgiDie("Error: Certificate already in database\n","It appears you have
requ
ested a certificate twice. This corrupted your previous certificate.
Please se
nd mail to your-email\@address.here so he can correct the problem. He will
then infor
m you to request a cert again.\n");
}
if ($input{'name'} ne "" &&
$input{'passwd'} ne "" &&
$input{'passwd2'} ne "" &&
($input{'passwd'} eq $input{'passwd2'}) &&
$input{'email'} ne "" &&
($input{'orgunit'} ne "" || $input{'orgunitother'} ne "") &&
$input{'city'} ne "" &&
(($input{'state'} ne "") || ($input{'country'} ne "US" && $input{'state'}
eq "
")) &&
$input{'country'} ne "") {
#
# Check which orgunit to use and fix state country conflicts
#
if ($input{'orgunit'} ne "") {
$organization_unit = $input{'orgunit'};
}
else {
$organization_unit = $input{'orgunitother'};
}
if ($input{'country'} ne "US") {
$new_state = "none";
}
else {
$new_state = $input{'state'};
}
#
# Create the certificate and private key, put that in email_address.cert
# while using expect to interact with openssl...
#
print &PrintHeader;
# print "<center><h2>Generating Certificate Request...</h2></center>";
print &HtmlTop ("Generating Certificate Request...");
print "<pre>\r";
my $command_req;
$command_req = Expect->spawn("/usr/local/ssl/bin/openssl req
$SSLEAY_CONFIG -
new -keyout ./temp/$input{'email'}.key -out
./temp/$input{'email'}.cert -days 18
25");
if ( $command_req->expect(5, "phrase:")) {
print $command_req "$input{'passwd'}\r";
}
if ( $command_req->expect(5, "phrase:")) {
print $command_req "$input{'passwd'}\r";
}
if ( $command_req->expect(5, "\[US\]:") ) {
print $command_req "$input{'country'}\r";
}
if ( $command_req->expect(5, "\[Some-State\]:")) {
print $command_req "$input{'state'}\r";
}
if ( $command_req->expect(5, "city")) {
print $command_req "$input{'city'}\r";
}
if ( $command_req->expect(5, "Ltd\]:")) {
print $command_req "$organization\r";
}
if ( $command_req->expect(5, "section\) \[\]:")) {
print $command_req "$organization_unit\r";
}
if ( $command_req->expect(5, "name\) \[\]:")) {
print $command_req "$input{'name'}\r";
}
if ( $command_req->expect(5, "Address \[\]:")) {
print $command_req "$input{'email'}\r";
}
if ( $command_req->expect(5, "password \[\]:")) {
print $command_req "\r";
}
if ( $command_req->expect(5, "company name \[\]:")) {
print $command_req "\r";
}
#
# Now cat the 2 together to form the request
#
sleep 2;
`cat ./temp/$input{'email'}.key ./temp/$input{'email'}.cert >>
./temp/$input{
'email'}.pem`;
#
sleep 1;
# Sign the certificate (and clean up some files)
#
`rm -f "./temp/$input{'email'}.cert"`;
print "\r\rCert AutoSigner v1.0...\r";
my $command_sign;
$command_sign = Expect->spawn("/usr/local/ssl/bin/openssl ca
$SSLEAY_CONFIG -
policy policy_anything -out ./temp/$input{'email'}.pem.signed -infiles
./temp/$i
nput{'email'}.pem");
if ( $command_sign->expect(5, "pass phrase:")) {
print $command_sign "CA password here\r";
}
if ( $command_sign->expect(5, "certificate")) {
print $command_sign "y\r";
}
sleep 1;
if ( $command_sign->expect(5, "commit\? \[y\/n\]")) {
print $command_sign "y\r\r";
}
sleep 2;
#
# Convert the signed cert to a pkcs12 certificate so Netscape and IE can
impo
rt.
# (and clean up some files)
`rm -f "./temp/$input{'email'}.pem"`;
`cat ./temp/$input{'email'}.key ./temp/$input{'email'}.pem.signed >>
./temp/$
input{'email'}.temp`;
sleep 3;
my $command_conv;
print "\r";
$command_conv = Expect->spawn("/usr/local/ssl/bin/openssl
pkcs12 -export -in
./temp/$input{'email'}.temp -out ./temp/$input{'email'}.p12 -name 'Your
Certific
ate for $input{'email'}' -certfile /usr/local/ssl/misc/yourCA/cacert.pem");
if ( $command_conv->expect(5, "pass phrase:")) {
print $command_conv "$input{'passwd'}\r";
}
if ( $command_conv->expect(5, "Export Password:")) {
print $command_conv "$input{'passwd'}\r";
}
if ( $command_conv->expect(5, "Export Password:")) {
print $command_conv "$input{'passwd'}\r";
}
#
`rm -f "./temp/$input{'email'}.key" "./temp/$input{'email'}.pem.signed"
"./te
mp/$input{'email'}.temp"`;
# E-mail [EMAIL PROTECTED] and tell him he has a cert to approve.
`echo '$input{'email'} has a certificate request.' | mail -s "certificate
req
uest" your-email\@address.here`;
print "</pre>\r";
print "</HTML></BODY>\r\n";
}
else {
print &PrintHeader;
print &HtmlTop ("Generating Certificate Request...");
print "ERROR: You left a required field blank or your passwords didn't
match.
Please go back and correct.\n";
print <<ENDOFTEXT;
<pre>
Your name is: +$input{'name'}+
Your password is: +********+
Your e-mail address is: +$input{'email'}+
Your Organization Unit is : +$organization_unit+
Your City is: +$input{'city'}+
Your State is: +$new_state+
Your Country is: +$input{'country'}+
</pre>
ENDOFTEXT
}
# Close the document cleanly.
print "<script
language=\"JavaScript\">window.location=\"http://your.site.here\"</
script>";
print &HtmlBot;
}
Brandon Amundson
BBN Technologies
LAB: 703 284 8189
[EMAIL PROTECTED]
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]