Skip to content

Commit 372c030

Browse files
Use two-tier CA signing for browser-trustable certificates
Co-Authored-By: Ryo Kobayashi <cuba6vst@gmail.com>
1 parent ef7c791 commit 372c030

File tree

2 files changed

+50
-10
lines changed

2 files changed

+50
-10
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,28 @@ php artisan sail-ssl:install
3131

3232
After containers started, you can access https://localhost.
3333

34+
## Trust the certificate (optional)
35+
36+
The plugin generates a local Root CA certificate to sign the server certificate.
37+
You can import the Root CA into your browser to remove the security warning.
38+
39+
### 1. Copy the Root CA certificate to your host machine:
40+
41+
```sh
42+
./vendor/bin/sail cp nginx:/etc/nginx/certs/root-ca.crt .
43+
```
44+
45+
### 2. Import the certificate:
46+
47+
- **Chrome**: Settings > Privacy and Security > Security > Manage certificates > Authorities > Import
48+
- **Firefox**: Settings > Privacy & Security > Security > View Certificates > Authorities > Import
49+
- **macOS**: Double-click the `root-ca.crt` file to open Keychain Access, then set "Always Trust"
50+
51+
> **Note:** If you change `SSL_DOMAIN` or `SSL_ALT_NAME`, remove the Docker volume `sail-nginx` to regenerate certificates:
52+
> ```sh
53+
> docker volume rm sail-nginx
54+
> ```
55+
3456
## Environment variables
3557
3658
- `SERVER_NAME`

nginx/generate-ssl-cert.sh

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,38 @@
11
#!/bin/sh
22

33
ME=$(basename $0)
4-
KEY=/etc/nginx/certs/server.key
5-
CERT=/etc/nginx/certs/server.pem
4+
CERTS_DIR=/etc/nginx/certs
5+
ROOT_KEY=$CERTS_DIR/root-ca.key
6+
ROOT_CERT=$CERTS_DIR/root-ca.crt
7+
KEY=$CERTS_DIR/server.key
8+
CERT=$CERTS_DIR/server.pem
9+
CSR=$CERTS_DIR/server.csr
10+
EXT_FILE=$CERTS_DIR/server-ext.cnf
611
CN=$SSL_DOMAIN
712
SAN=$SSL_ALT_NAME
813

914
if [ -f $KEY ] && [ -f $CERT ]; then
1015
echo "$ME: Server certificate already exists, do nothing."
1116
else
12-
if [ -n "$SAN" ]; then
13-
openssl req -x509 -newkey rsa:2048 -keyout $KEY \
14-
-out $CERT -sha256 -days 3650 -nodes -subj "/CN=$CN" -addext "subjectAltName = $SAN"
15-
else
16-
openssl req -x509 -newkey rsa:2048 -keyout $KEY \
17-
-out $CERT -sha256 -days 3650 -nodes -subj "/CN=$CN"
18-
fi
19-
echo "$ME: Server certificate has been generated."
17+
openssl req -x509 -newkey rsa:2048 -keyout $ROOT_KEY -out $ROOT_CERT \
18+
-sha256 -days 3650 -nodes -subj "/CN=$CN Root CA"
19+
20+
openssl req -newkey rsa:2048 -keyout $KEY -out $CSR \
21+
-nodes -subj "/CN=$CN"
22+
23+
{
24+
echo "basicConstraints = CA:FALSE"
25+
echo "keyUsage = digitalSignature, keyEncipherment"
26+
echo "extendedKeyUsage = serverAuth"
27+
if [ -n "$SAN" ]; then
28+
echo "subjectAltName = $SAN"
29+
fi
30+
} > $EXT_FILE
31+
32+
openssl x509 -req -in $CSR -CA $ROOT_CERT -CAkey $ROOT_KEY \
33+
-CAcreateserial -out $CERT -sha256 -days 3650 -extfile $EXT_FILE
34+
35+
rm -f $CSR $EXT_FILE $CERTS_DIR/root-ca.srl
36+
echo "$ME: Root CA and server certificate have been generated."
37+
echo "$ME: Import $ROOT_CERT into your browser to trust the certificate."
2038
fi

0 commit comments

Comments
 (0)