]> Sergey Matveev's repositories - public-inbox.git/blob - certs/create-certs.perl
nntp: use substr to check for trailing CRLF
[public-inbox.git] / certs / create-certs.perl
1 #!/usr/bin/perl -w
2 # License: GPL-1.0+ or Artistic-1.0-Perl
3 # from IO::Socket::SSL 2.063 / https://github.com/noxxi/p5-io-socket-ssl
4 use strict;
5 use warnings;
6 use IO::Socket::SSL::Utils;
7 use Net::SSLeay;
8
9 my $dir = -d 'certs' && -f 'Makefile.PL' ? './certs/' : './';
10 my $now = time();
11 my $later = 0x7fffffff; # 2038 problems on 32-bit :<
12
13 Net::SSLeay::SSLeay_add_ssl_algorithms();
14 my $sha256 = Net::SSLeay::EVP_get_digestbyname('sha256') or die;
15 my $printfp = sub {
16     my ($w,$cert) = @_;
17     print $w.' sha256$'.unpack('H*',Net::SSLeay::X509_digest($cert, $sha256))."\n"
18 };
19
20 my %time_valid = (not_before => $now, not_after => $later);
21
22 my @ca = CERT_create(
23     CA => 1,
24     subject => { CN => 'IO::Socket::SSL Demo CA' },
25     %time_valid,
26 );
27 save('test-ca.pem',PEM_cert2string($ca[0]));
28
29 my @server = CERT_create(
30     CA => 0,
31     subject => { CN => 'server.local' },
32     purpose => 'server',
33     issuer => \@ca,
34     %time_valid,
35 );
36 save('server-cert.pem',PEM_cert2string($server[0]));
37 save('server-key.pem',PEM_key2string($server[1]));
38 $printfp->(server => $server[0]);
39
40 @server = CERT_create(
41     CA => 0,
42     subject => { CN => 'server2.local' },
43     purpose => 'server',
44     issuer => \@ca,
45     %time_valid,
46 );
47 save('server2-cert.pem',PEM_cert2string($server[0]));
48 save('server2-key.pem',PEM_key2string($server[1]));
49 $printfp->(server2 => $server[0]);
50
51 @server = CERT_create(
52     CA => 0,
53     subject => { CN => 'server-ecc.local' },
54     purpose => 'server',
55     issuer => \@ca,
56     key => KEY_create_ec(),
57     %time_valid,
58 );
59 save('server-ecc-cert.pem',PEM_cert2string($server[0]));
60 save('server-ecc-key.pem',PEM_key2string($server[1]));
61 $printfp->('server-ecc' => $server[0]);
62
63
64 my @client = CERT_create(
65     CA => 0,
66     subject => { CN => 'client.local' },
67     purpose => 'client',
68     issuer => \@ca,
69     %time_valid,
70 );
71 save('client-cert.pem',PEM_cert2string($client[0]));
72 save('client-key.pem',PEM_key2string($client[1]));
73 $printfp->(client => $client[0]);
74
75 my @swc = CERT_create(
76     CA => 0,
77     subject => { CN => 'server.local' },
78     purpose => 'server',
79     issuer => \@ca,
80     subjectAltNames => [
81         [ DNS => '*.server.local' ],
82         [ IP => '127.0.0.1' ],
83         [ DNS => 'www*.other.local' ],
84         [ DNS => 'smtp.mydomain.local' ],
85         [ DNS => 'xn--lwe-sna.idntest.local' ]
86     ],
87     %time_valid,
88 );
89 save('server-wildcard.pem',PEM_cert2string($swc[0]),PEM_key2string($swc[1]));
90
91
92 my @subca = CERT_create(
93     CA => 1,
94     issuer => \@ca,
95     subject => { CN => 'IO::Socket::SSL Demo Sub CA' },
96     %time_valid,
97 );
98 save('test-subca.pem',PEM_cert2string($subca[0]));
99 @server = CERT_create(
100     CA => 0,
101     subject => { CN => 'server.local' },
102     purpose => 'server',
103     issuer => \@subca,
104     %time_valid,
105 );
106 save('sub-server.pem',PEM_cert2string($server[0]).PEM_key2string($server[1]));
107
108
109
110 my @cap = CERT_create(
111     CA => 1,
112     subject => { CN => 'IO::Socket::SSL::Intercept' },
113     %time_valid,
114 );
115 save('proxyca.pem',PEM_cert2string($cap[0]).PEM_key2string($cap[1]));
116
117 sub save {
118     my $file = shift;
119     open(my $fd,'>',$dir.$file) or die $!;
120     print $fd @_;
121 }
122
123 system(<<CMD);
124 cd $dir
125 set -x
126 openssl x509 -in server-cert.pem -out server-cert.der -outform der
127 openssl rsa -in server-key.pem -out server-key.der -outform der
128 openssl rsa -in server-key.pem -out server-key.enc -passout pass:bluebell
129 openssl rsa -in client-key.pem -out client-key.enc -passout pass:opossum
130 openssl pkcs12 -export -in server-cert.pem -inkey server-key.pem -out server.p12 -passout pass:
131 openssl pkcs12 -export -in server-cert.pem -inkey server-key.pem -out server_enc.p12 -passout pass:bluebell
132 CMD