1 Create Your Own SSL Certificate Authority for Local HTTPS Development
https://deliciousbrains.com/ssl-certificate-authority-for-local-https-development/
we’re ready to generate the private key to become a local CA:
openssl genrsa -des3 -out myCA.key 2048
Next, we generate a root certificate:
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem
You should now have two files: myCA.key (your private key) and myCA.pem (your root certificate). Congratulations, you’re now a CA. Sort of.
Note: Important: if you want your CA certificate to work on Android properly, then add the following options when generating CA: openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem -reqexts v3_req -extensions v3_ca
2 #Adding the Root Certificate to Linux
# {{{ There are so many Linux distributions, but Ubuntu is by far the most popular and it’s what we used when we built SpinupWP. Therefore these instructions will cover Ubuntu.
If it isn’t already installed, install the ca-certificates package.
emerge -avq app-misc/ca-certificates
Copy the myCA.pem file to the /usr/local/share/ca-certificates directory as a myCA.crt file.
cp ~/certs/myCA.pem /usr/local/share/ca-certificates/myCA.crt
Update the certificate store.
update-ca-certificates
You can test that the certificate has been installed by running the following command:
awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt | grep Hellfish # grep -i gilhad or whatever we used
awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < myCA.pem # to see it without installation
# }}}
3 Creating CA-Signed Certificates for Your Dev Sites
Now we’re a CA on all our devices and we can sign certificates for any new dev sites that need HTTPS. First, we create a private key for the dev site (hellfish.test / wiki.gilhad.cz). Note that we name the private key using the domain name URL of the dev site. This is not required, but it makes it easier to manage if you have multiple sites:
openssl genrsa -out hellfish.test.key 2048
Then we create a CSR:
openssl req -new -key hellfish.test.key -out hellfish.test.csr
You’ll get all the same questions as you did above and, again, your answers don’t matter. In fact, they matter even less because you won’t be looking at this certificate in a list next to others.
Finally, we’ll create an X509 V3 certificate extension config file, which is used to define the Subject Alternative Name (SAN) for the certificate. In our case, we’ll create a configuration file called hellfish.test.ext containing the following text:
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = hellfish.test
We’ll be running openssl x509 because the x509 command allows us to edit certificate trust settings. In this case we’re using it to sign the certificate in conjunction with the config file, which allows us to set the Subject Alternative Name. I originally found this answer on Stack Overflow.
Now we run the command to create the certificate: using our CSR, the CA private key, the CA certificate, and the config file:
openssl x509 -req -in hellfish.test.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out hellfish.test.crt -days 825 -sha256 -extfile hellfish.test.ext
We now have three files: hellfish.test.key (the private key), hellfish.test.csr (the certificate signing request, or csr file), and hellfish.test.crt (the signed certificate). We can configure local web servers to use HTTPS with the private key and the signed certificate.
If you’re on Linux or Windows using Apache, you’ll need to enable the Apache SSL mod, and configure an Apache virtual host for port 443 for the local site. It will require you to add the SSLEngine, SSLCertificateFile, and SSLCertificateKeyFile directives, and point the last two to the certificate and key file you just created.
<VirtualHost *:443> #*
ServerName hellfish.test
DocumentRoot /var/www/hellfish-test
SSLEngine on
SSLCertificateFile /path/to/certs/hellfish.test.crt
SSLCertificateKeyFile /path/to/certs/hellfish.test.key
</VirtualHost>
4 Tak a aplikace na můj problém
4.1 skript_CA
#!/bin/bash # vim: fileencoding=utf-8:nowrap:textwidth=0:foldmethod=marker:foldcolumn=4:ruler:showcmd:lcs=tab\:|- list echo '01' > serial touch index.txt mkdir -p priv mkdir -p public mkdir -p server mkdir -p certs ################################################################################ cat >openssl.cnf <<EOF # # OpenSSL configuration file. # # Establish working directory. dir = . ts = 1024 # Size of keys default_bits = 1024 default_keyfile = key.pem # name of generated keys default_md = sha512 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name req_extensions = v3_req [ req_distinguished_name ] # Variable name Prompt string #---------------------- ---------------------------------- 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 subjectAltName = DNS:name,DNS:name,.... # Default values for the above, for consistency and less typing. # Variable name Value #------------------------------ ------------------------------ 0.organizationName_default = Gilhad localityName_default = Praha stateOrProvinceName_default = Praha countryName_default = CZ commonName_default= Gilhad organizationalUnitName_default = osvc emailAddress_default = gilhad@seznam.cz [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always [ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash [ ca ] default_ca = CA_default [ CA_default ] serial = \$dir/serial database = \$dir/index.txt new_certs_dir = \$dir/certs certificate = \$dir/public/gilhad.CAcert.pem private_key = \$dir/priv/gilhad.CAkey.pem default_days = 36500 default_md = sha512 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match # Extension copying option: use with caution. copy_extensions = copy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional EOF ################################################################################ openssl genrsa -out priv/gilhad.CAkey.pem 2048 openssl req -x509 -new -nodes -key priv/gilhad.CAkey.pem -days 36500 -out public/gilhad.CAcert.pem -config ./openssl.cnf -batch # openssl req -new -x509 -keyout priv/gilhad.CAkey.pem -out public/gilhad.CAcert.pem -days 36500 -config ./openssl.cnf -passout pass:heslo -batch openssl x509 -in public/gilhad.CAcert.pem -noout -purpose openssl x509 -in public/gilhad.CAcert.pem -noout -text openssl x509 -in public/gilhad.CAcert.pem -noout -dates cp public/gilhad.CAcert.pem server echo index.txt.old >>.gitignore echo index.txt.attr.old >>.gitignore echo serial.old >>.gitignore ##################################### git add certs priv public server index.txt openssl.cnf serial .gitignore
4.2 skript_web
#!/bin/bash
# vim: fileencoding=utf-8:nowrap:textwidth=0:foldmethod=marker:foldcolumn=4:ruler:showcmd:lcs=tab\:|- list
if [ $# == "0" ] ; then
echo "$0 name.for.cert web.name.cz alt.name.1 [alt.name.2 ...]"
echo " eg.: ./skript_web gilhad.cz *.gilhad.cz gilhad.cz *.gilhad.cz"
exit
fi
save_as=$1
shift
web=$1
shift
alt_names=$1
if [ "${alt_names}" == "" ] ; then
alt_names=${web}
fi
if [ "${alt_names}" == "" ] ; then
alt_names=${save_as}
fi
if [ "${web}" == "" ] ; then
web=${save_as}`date '+ %Y.%m.%d %H:%M:%S'`
fi
cat >v3_req.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
EOF
x=0
while true ; do
echo "DNS.$((++x)) = $alt_names" >> v3_req.ext
shift
if [ $# == 0 ] ; then break; fi
alt_names=$1
done
mkdir -p priv
mkdir -p public
mkdir -p server
mkdir -p certs
################################################################################
cat >openssl.web.cnf <<EOF
#
# OpenSSL configuration file.
#
# Establish working directory.
dir = .
ts = 1024 # Size of keys
default_bits = 1024
default_md = sha512 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[ req_distinguished_name ]
organizationName = Gilhad
localityName = Praha
stateOrProvinceName = Praha
countryName = CZ
commonName = ${web}
organizationalUnitName = osvc
emailAddress = gilhad@seznam.cz
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
[ ca ]
default_ca = CA_default
[ CA_default ]
serial = \$dir/serial
database = \$dir/index.txt
new_certs_dir = \$dir/certs
certificate = \$dir/public/gilhad.CAcert.pem
private_key = \$dir/priv/gilhad.CAkey.pem
default_days = 36500
default_md = sha512
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
# Extension copying option: use with caution.
#copy_extensions = copy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
subjectAltName = optional
EOF
################################################################################
#1 private key
openssl genrsa -out priv/${save_as}.privkey.pem 2048
#2 Then we create a CSR:
openssl req -new -nodes -key priv/${save_as}.privkey.pem -out public/${save_as}.csr -config ./openssl.web.cnf
#openssl req -newkey rsa:4096 -nodes -out public/${save_as}.csr -keyout priv/${save_as}.privkey.pem -config ./openssl.web.cnf <<EOF
#
#
#
#
#
#
#${web}
#${alt_names}
#EOF
#openssl req -in public/${save_as}.csr -text -verify -noout
#3 create the certificate
#yes|openssl ca -passin pass:heslo -in public/${save_as}.csr -out public/${save_as}.pem -config ./openssl.web.cnf
yes|openssl ca -passin pass:heslo -in public/${save_as}.csr -out public/${save_as}.pem -config ./openssl.web.cnf -extfile v3_req.ext
# openssl x509 -req -in hellfish.test.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out hellfish.test.crt -days 825 -sha256 -extfile hellfish.test.ext
cp priv/${save_as}.privkey.pem public/${save_as}.pem server
openssl x509 -in server/${save_as}.pem -noout -text
# rm openssl.web.cnf
#####################################
git add certs priv public server index.txt.attr index.txt serial
Můj nový počítač 