@@ -36,7 +36,8 @@ ffi.cdef[[
36
36
size_t pem_len, unsigned char *der, char **err);
37
37
38
38
int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,
39
- size_t pem_len, unsigned char *der, char **err);
39
+ size_t pem_len, const unsigned char *passphrase,
40
+ unsigned char *der, char **err);
40
41
41
42
int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,
42
43
const char *data, size_t len, char **err);
@@ -130,7 +131,7 @@ __DATA__
130
131
131
132
out = ffi.new("char [?]", #pkey)
132
133
133
- local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)
134
+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, nil, out, errmsg)
134
135
if rc < 1 then
135
136
ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
136
137
ffi.string(errmsg[0]))
@@ -284,7 +285,7 @@ lua ssl server name: "test.com"
284
285
285
286
out = ffi.new("char [?]", #pkey)
286
287
287
- local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)
288
+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, nil, out, errmsg)
288
289
if rc < 1 then
289
290
ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
290
291
ffi.string(errmsg[0]))
@@ -422,7 +423,7 @@ lua ssl server name: "test.com"
422
423
423
424
out = ffi.new("char [?]", #pkey)
424
425
425
- local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)
426
+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, nil, out, errmsg)
426
427
if rc < 1 then
427
428
ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
428
429
ffi.string(errmsg[0]))
@@ -1024,3 +1025,175 @@ client certificate subject: nil
1024
1025
--- no_error_log
1025
1026
[error]
1026
1027
[alert]
1028
+
1029
+
1030
+
1031
+ === TEST 9: simple cert + private key with passphrase
1032
+ --- http_config
1033
+ server {
1034
+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1035
+ server_name test.com;
1036
+
1037
+ ssl_certificate_by_lua_block {
1038
+ collectgarbage()
1039
+
1040
+ local ffi = require "ffi"
1041
+
1042
+ ffi.cdef[[
1043
+ int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,
1044
+ size_t pem_len, unsigned char *der, char **err);
1045
+
1046
+ int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,
1047
+ size_t pem_len, const unsigned char *passphrase,
1048
+ unsigned char *der, char **err);
1049
+
1050
+ int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,
1051
+ const char *data, size_t len, char **err);
1052
+
1053
+ int ngx_http_lua_ffi_ssl_set_der_private_key(void *r,
1054
+ const char *data, size_t len, char **err);
1055
+
1056
+ int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);
1057
+ ]]
1058
+
1059
+ local errmsg = ffi.new("char *[1]")
1060
+
1061
+ local r = require "resty.core.base" .get_request()
1062
+ if not r then
1063
+ ngx.log(ngx.ERR, "no request found")
1064
+ return
1065
+ end
1066
+
1067
+ ffi.C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)
1068
+
1069
+ local f = assert(io.open("t/cert/test_passphrase.crt", "rb"))
1070
+ local cert = f:read("*all")
1071
+ f:close()
1072
+
1073
+ local out = ffi.new("char [?]", #cert)
1074
+
1075
+ local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)
1076
+ if rc < 1 then
1077
+ ngx.log(ngx.ERR, "failed to parse PEM cert: ",
1078
+ ffi.string(errmsg[0]))
1079
+ return
1080
+ end
1081
+
1082
+ local cert_der = ffi.string(out, rc)
1083
+
1084
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_certificate(r, cert_der, #cert_der, errmsg)
1085
+ if rc ~= 0 then
1086
+ ngx.log(ngx.ERR, "failed to set DER cert: ",
1087
+ ffi.string(errmsg[0]))
1088
+ return
1089
+ end
1090
+
1091
+ f = assert(io.open("t/cert/test_passphrase.key", "rb"))
1092
+ local pkey = f:read("*all")
1093
+ f:close()
1094
+
1095
+ local passphrase = "123456"
1096
+
1097
+ out = ffi.new("char [?]", #pkey)
1098
+
1099
+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, passphrase, out, errmsg)
1100
+ if rc < 1 then
1101
+ ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
1102
+ ffi.string(errmsg[0]))
1103
+ return
1104
+ end
1105
+
1106
+ local pkey_der = ffi.string(out, rc)
1107
+
1108
+ local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_private_key(r, pkey_der, #pkey_der, errmsg)
1109
+ if rc ~= 0 then
1110
+ ngx.log(ngx.ERR, "failed to set DER priv key: ",
1111
+ ffi.string(errmsg[0]))
1112
+ return
1113
+ end
1114
+ }
1115
+
1116
+ ssl_certificate ../../cert/test2.crt;
1117
+ ssl_certificate_key ../../cert/test2.key;
1118
+
1119
+ server_tokens off;
1120
+ location /foo {
1121
+ default_type 'text/plain';
1122
+ content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }
1123
+ more_clear_headers Date;
1124
+ }
1125
+ }
1126
+ --- config
1127
+ server_tokens off;
1128
+ lua_ssl_trusted_certificate ../../cert/test_passphrase.crt;
1129
+
1130
+ location /t {
1131
+ content_by_lua_block {
1132
+ do
1133
+ local sock = ngx.socket.tcp()
1134
+
1135
+ sock:settimeout(2000)
1136
+
1137
+ local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1138
+ if not ok then
1139
+ ngx.say("failed to connect: ", err)
1140
+ return
1141
+ end
1142
+
1143
+ ngx.say("connected: ", ok)
1144
+
1145
+ local sess, err = sock:sslhandshake(nil, "test.com", false)
1146
+ if not sess then
1147
+ ngx.say("failed to do SSL handshake: ", err)
1148
+ return
1149
+ end
1150
+
1151
+ ngx.say("ssl handshake: ", type(sess))
1152
+
1153
+ local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"
1154
+ local bytes, err = sock:send(req)
1155
+ if not bytes then
1156
+ ngx.say("failed to send http request: ", err)
1157
+ return
1158
+ end
1159
+
1160
+ ngx.say("sent http request: ", bytes, " bytes.")
1161
+
1162
+ while true do
1163
+ local line, err = sock:receive()
1164
+ if not line then
1165
+ -- ngx.say("failed to recieve response status line: ", err)
1166
+ break
1167
+ end
1168
+
1169
+ ngx.say("received: ", line)
1170
+ end
1171
+
1172
+ local ok, err = sock:close()
1173
+ ngx.say("close: ", ok, " ", err)
1174
+ end -- do
1175
+ -- collectgarbage()
1176
+ }
1177
+ }
1178
+
1179
+ --- request
1180
+ GET /t
1181
+ --- response_body
1182
+ connected: 1
1183
+ ssl handshake: userdata
1184
+ sent http request: 56 bytes.
1185
+ received: HTTP/1.1 201 Created
1186
+ received: Server: nginx
1187
+ received: Content-Type: text/plain
1188
+ received: Content-Length: 4
1189
+ received: Connection: close
1190
+ received:
1191
+ received: foo
1192
+ close: 1 nil
1193
+
1194
+ --- error_log
1195
+ lua ssl server name: "test.com"
1196
+
1197
+ --- no_error_log
1198
+ [error]
1199
+ [alert]
0 commit comments