Skip to content

Commit 34282bb

Browse files
authored
Merge pull request #200 from julek-wolfssl/ocsp-responder
Implement OCSP client and responder with HTTP and SCGI transport
2 parents 165a6e1 + 7162aa0 commit 34282bb

30 files changed

Lines changed: 3788 additions & 42 deletions

.github/workflows/fsanitize-check.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ jobs:
6262
runs-on: ${{ matrix.os }}
6363
timeout-minutes: 4
6464
steps:
65+
- name: Install dependencies
66+
run: |
67+
# Don't prompt for anything
68+
export DEBIAN_FRONTEND=noninteractive
69+
sudo apt-get update
70+
# openssl and nginx used for ocsp testing
71+
sudo apt-get install -y openssl nginx
72+
6573
- name: Checking cache for wolfssl
6674
uses: actions/cache@v4
6775
with:

.github/workflows/ubuntu-check.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ jobs:
1212
runs-on: ubuntu-latest
1313

1414
steps:
15+
- name: Install dependencies
16+
run: |
17+
# Don't prompt for anything
18+
export DEBIAN_FRONTEND=noninteractive
19+
sudo apt-get update
20+
# openssl and nginx used for ocsp testing
21+
sudo apt-get install -y openssl nginx
1522
- uses: actions/checkout@master
1623
with:
1724
repository: wolfssl/wolfssl

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ autom4te.cache/
1010
config.log
1111
config.status
1212
configure
13+
configure~
1314
clu_src/config.h.in*
1415
*.lo
1516
*.Plo
@@ -35,3 +36,7 @@ src/config.h.in~
3536
src/stamp-h1
3637
*.gcno
3738
*.gcda
39+
.cproject
40+
.project
41+
.settings/
42+
AGENTS.md

Makefile.am

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ include tests/pkey/include.am
5151
include tests/dgst/include.am
5252
include tests/rand/include.am
5353
include tests/base64/include.am
54+
include tests/ocsp/include.am
55+
include tests/ocsp-scgi/include.am
5456
include tests/pkcs/include.am
5557
include tests/x509/include.am
5658
include tests/encrypt/include.am

README.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,102 @@ wolfssl ca -altextend -in B.cert -keyfile ecc-key-A.priv -altkey ml-dsa-key-A.pr
200200
wolfssl ca -altextend -in C.cert -keyfile ecc-key-B.priv -altkey ml-dsa-key-B.priv -altpub ml-dsa-key-C.pub -subjkey ecc-key-C.priv -cert B-chimera.cert -out C-chimera.cert
201201
```
202202

203+
## Deploying an OCSP Responder with nginx and SCGI
204+
205+
wolfCLU includes an OCSP responder that can be deployed in production using nginx as an HTTP frontend and SCGI (Simple Common Gateway Interface) as the communication protocol. **This is the preferred deployment method** because SCGI is much simpler than HTTP while allowing you to leverage a mature and robust HTTP implementation like nginx.
206+
207+
### Why SCGI?
208+
209+
- **Simplicity**: SCGI is a straightforward protocol that's easier to implement than full HTTP
210+
- **Robustness**: nginx handles all HTTP concerns (timeouts, keep-alive, TLS, load balancing, etc.)
211+
- **Separation of roles**: The OCSP responder focuses on OCSP logic, nginx handles web serving
212+
213+
### Prerequisites
214+
215+
Install nginx:
216+
```
217+
sudo apt-get install nginx # Debian/Ubuntu
218+
sudo yum install nginx # RHEL/CentOS
219+
brew install nginx # macOS
220+
```
221+
222+
### Basic Setup
223+
224+
1. **Start the wolfCLU OCSP responder in SCGI mode:**
225+
226+
```bash
227+
wolfssl ocsp -scgi \
228+
-port 8081 \
229+
-index /path/to/index.txt \
230+
-rsigner /path/to/ca-cert.pem \
231+
-rkey /path/to/ca-key.pem \
232+
-CA /path/to/ca-cert.pem
233+
```
234+
235+
The responder will listen on port 8081 for SCGI connections.
236+
237+
2. **Configure nginx to proxy HTTP OCSP requests to the SCGI backend:**
238+
239+
Create a file `/etc/nginx/ocsp-scgi.conf`:
240+
241+
```nginx
242+
# SCGI parameters for OCSP
243+
scgi_param REQUEST_METHOD $request_method;
244+
scgi_param REQUEST_URI $request_uri;
245+
scgi_param QUERY_STRING $query_string;
246+
scgi_param CONTENT_TYPE $content_type;
247+
scgi_param CONTENT_LENGTH $content_length;
248+
249+
scgi_param SCRIPT_NAME $fastcgi_script_name;
250+
scgi_param DOCUMENT_URI $document_uri;
251+
scgi_param DOCUMENT_ROOT $document_root;
252+
scgi_param SERVER_PROTOCOL $server_protocol;
253+
scgi_param HTTPS $https if_not_empty;
254+
255+
scgi_param REMOTE_ADDR $remote_addr;
256+
scgi_param REMOTE_PORT $remote_port;
257+
scgi_param SERVER_PORT $server_port;
258+
scgi_param SERVER_NAME $server_name;
259+
```
260+
261+
Add to your nginx site configuration (e.g., `/etc/nginx/sites-available/default`):
262+
263+
```nginx
264+
server {
265+
listen 80;
266+
server_name ocsp.example.com;
267+
268+
location /ocsp {
269+
scgi_pass localhost:8081;
270+
include /etc/nginx/ocsp-scgi.conf;
271+
272+
scgi_connect_timeout 5s;
273+
scgi_send_timeout 10s;
274+
scgi_read_timeout 10s;
275+
}
276+
}
277+
```
278+
279+
3. **Reload nginx:**
280+
281+
```bash
282+
sudo nginx -t # Test configuration
283+
sudo systemctl reload nginx # Reload nginx
284+
```
285+
286+
4. **Test the OCSP responder:**
287+
288+
```bash
289+
wolfssl ocsp \
290+
-issuer ca-cert.pem \
291+
-cert server-cert.pem \
292+
-url http://ocsp.example.com/ocsp
293+
```
294+
295+
### Index File Format
296+
297+
The `-index` file uses OpenSSL's CA index format.
298+
203299
## Contacts
204300

205301
Please contact support@wolfssl.com with any questions or comments.

autogen.sh

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,6 @@
33
# Create configure and makefile stuff...
44
#
55

6-
# Git hooks should come before autoreconf.
7-
if [ -d .git ]; then
8-
if [ ! -d .git/hooks ]; then
9-
mkdir .git/hooks || exit $?
10-
fi
11-
12-
if [ ! -e .git/hooks/pre-commit ]; then
13-
ln -s ../../pre-commit.sh .git/hooks/pre-commit || exit $?
14-
fi
15-
fi
16-
17-
186
set -e
197

208
# if get an error about libtool not setup

certs/ocsp-responder-cert.pem

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEoTCCA4mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx
3+
EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh
4+
d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz
5+
bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjYwMjE4
6+
MTkxNDQxWhcNMjgxMTE0MTkxNDQxWjB1MQswCQYDVQQGEwJVUzEQMA4GA1UECAwH
7+
TW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTCBPQ1NQ
8+
MRIwEAYDVQQLDAlSZXNwb25kZXIxFzAVBgNVBAMMDk9DU1AgUmVzcG9uZGVyMIIB
9+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApMVQ84ki9B8QgCRpwhEE0z5A
10+
uKgi3KDK2cFimJrLX/JG7Rzq+SMj8X3yIEB4eP5FYVLvugAAbR0p4Vqb2mgOrleo
11+
hwGg/1tgqoZaxXJVFFySpUUW+L0VCh6+CB80+KHss2Sb7xFNfWzd+yFRyN/jKhaT
12+
nvusFwSnYKdMMxJlV/zAhVEPKIfqS4N8JRQhLJW38z1f7Jb+uB94JReCuKZiayx4
13+
wFh189EjLq9u/bJoCNy60HzzyAHZqiGM2I3Pk6mw2+twJZGOEhH0q+kL/w9ZfJpt
14+
3j+Dct/5jpNsPI3aIw94qAnIQC5de7xdAk9JvVm0ujxsat6t5NyRLYx/xOClOQID
15+
AQABo4IBGjCCARYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUFqtdxd3qLuCtJ53mlNZQ
16+
ugLQ/wIwgdQGA1UdIwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcw
17+
gZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl
18+
bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG
19+
A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz
20+
c2wuY29tghRrm3DG8aOUZRmhCFjvp40reoPB2jATBgNVHSUEDDAKBggrBgEFBQcD
21+
CTANBgkqhkiG9w0BAQsFAAOCAQEAPZSIsDoFVKciK39jhVI/uBbfwKlgLvRhrofc
22+
5Xt2GsX/ebaY7SXmFcBycG7t6PL8wZCMtisqPb5XFjEXYoTvgYeDSuuEYW7hTYqW
23+
hXLdqLFaMaql2chMDmx5dMO84KKLaq+z3QTHO1Imbz0gsagT4yz3Xk3zcUN07EDc
24+
R/gWq41CxcCyiPeeoscKE8EOq+E9eN8mc34EbUU6swuHNHwGqSLo7d9y0w5/cgRD
25+
Ma0WAC0FvLqfNwek08UzEYOD2BMZhzDQOynINbaGuY1GZdPUK2RwzVgkOOaR08Bv
26+
ZBJs3IwBBgE8u5n63xHrmCnehxxtl0vC0IXw44+lt+fF9gc6Mg==
27+
-----END CERTIFICATE-----

certs/ocsp-responder-key.pem

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCkxVDziSL0HxCA
3+
JGnCEQTTPkC4qCLcoMrZwWKYmstf8kbtHOr5IyPxffIgQHh4/kVhUu+6AABtHSnh
4+
WpvaaA6uV6iHAaD/W2CqhlrFclUUXJKlRRb4vRUKHr4IHzT4oeyzZJvvEU19bN37
5+
IVHI3+MqFpOe+6wXBKdgp0wzEmVX/MCFUQ8oh+pLg3wlFCEslbfzPV/slv64H3gl
6+
F4K4pmJrLHjAWHXz0SMur279smgI3LrQfPPIAdmqIYzYjc+TqbDb63AlkY4SEfSr
7+
6Qv/D1l8mm3eP4Ny3/mOk2w8jdojD3ioCchALl17vF0CT0m9WbS6PGxq3q3k3JEt
8+
jH/E4KU5AgMBAAECggEADmjxPPMz2tyyoTpOA3pgjSbnGx8dOWVYiDW47TawbZov
9+
KMJ8LECt/oswtzBcONyn7ayGqaIhZ2mDBaHaen3aNtYUt4Xlch+oMxGf85+doDO+
10+
YXTK3wMOSX3JycUM6Wej30Z/uqctOzhfq3xM/j/SSpaB34gME1FFYBcRe2/y7ABb
11+
TycvgSmvK0hVklDa488He+lNdHPh01aJnKGpKU33qMndhNf+dAcZtXUvkBSe1RdP
12+
y4KWUG+paHWVB7r7upTuVvVV964Ie0+Ji7PwG3eq1yf2SgOpe+/rf8WmNu5qEoLW
13+
Y/nZXwD27RaVb5L4p0itfSM+m61R+lzMasPYruhnAQKBgQDYT2RiDYUdMfgcH/Kl
14+
jmfIpgWrI5rkiN/wbEI+xbkWdzjbbUnAgA6CC5F5xmQA2B/ekNBqxcB6AqPGkD+t
15+
4kx0Kz2VQSBVIWQ0Q2z0xZ9GrYiIGIv8CGdNN+XBvXBXMMYx6QcYtY3aSNV2fx7W
16+
IUVnbzLyHI6KzElx3OT1uWXrwQKBgQDDAP8G0qT9KUnyXBNK27WurGMJo1bOLS1l
17+
8odVXrijQy/geDfxrr0UkoootBIs9aOP/Y1SZ32cqW9H9GDTb6HB4zAaUQvY07wS
18+
wq/0rgwIDWjL7zKaK8Pv9BhZmpQqRDqhZypJ2EkEGdgdd1to2zL5k3OdPN/XW4nG
19+
VrHhsH33eQKBgQCPG0dQT52HiS2afdBsk2A6MQyDAtVQ6PUu/JB/MxSWtl2ZXh5z
20+
CsWOZ9Tg+c3jeRjsiGY6nYYPsntjvL9EbPkjyg++FQ4tBCBlK06ESdJsUhaH46WJ
21+
Io4lWhvZJ1mRdaVKE98sC8FDbvg6ozNlezGNktXjs9ziGvFkMT4RC41QgQKBgGHY
22+
eh5+S3ML6KLHOJbzL3J55SfM4Z2KZaEl1GotoQ+qgrdrGwcV2qIb9V7/G6+bgXqa
23+
ivKyIwEcs02zfXIaLVwQFu7dg8hEVbZEIe3v9vGDaPYLC6T4GNSp8h3jxjx/B7w8
24+
+6cZ82kvXpVKcn9mnWlFZ1maVebFc5gloBPSbyJhAoGAJ2p1TzI8/c2xVOxhE0AO
25+
WTcpIiYNiHMotIBruSl9I2siaKklcyQKaMieAFQgylhsiORhKq0hUfMPQEfFcYL5
26+
mOPEzqf5/FBAFvzNxgk8lvXXM11TuZoKEFg5LTjgdHojl74urWk5asN4OziCZ+qI
27+
W3r7lHub6JynJhqe91sJmnE=
28+
-----END PRIVATE KEY-----

certs/ocsp.cnf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[ v3_ocsp ]
2+
basicConstraints = CA:false
3+
subjectKeyIdentifier = hash
4+
authorityKeyIdentifier = keyid:always,issuer:always
5+
extendedKeyUsage = OCSPSigning

certs/renew.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,17 @@ cp $CERTS_DIR/intermediate/client-int-cert.pem .
4646
#cp $CERTS_DIR/../examples/client/client.c ../src/client/client.c
4747
#sed -i '' "s/examples\/client\//wolfclu\//" ../src/client/client.c
4848

49+
echo "Generate OCSP responder certificate"
50+
openssl genrsa -out ocsp-responder-key.pem 2048
51+
openssl req -new -key ocsp-responder-key.pem -out ocsp-responder.csr \
52+
-subj "/C=US/ST=Montana/L=Bozeman/O=wolfSSL OCSP/OU=Responder/CN=OCSP Responder"
53+
openssl x509 -req -in ocsp-responder.csr \
54+
-CA ca-cert.pem -CAkey ca-key.pem \
55+
-extfile ocsp.cnf -extensions v3_ocsp \
56+
-days 1000 -set_serial 100 -out ocsp-responder-cert.pem
57+
rm ocsp-responder.csr
58+
echo "OCSP responder certificate created"
59+
4960
echo "Recreate expected encrypted data with new files"
5061
openssl enc -aes-256-cbc -nosalt -in ./crl.der -out ./crl.der.enc -k ""
5162
openssl enc -base64 -aes-256-cbc -nosalt -in ./crl.der -out ./crl.der.enc.base64 -k ""

0 commit comments

Comments
 (0)