Skip to content

Commit d82f27b

Browse files
committed
HTTPS: get back self-signed certificate, document mkcrt for localhost certificates
1 parent bfb6cb4 commit d82f27b

File tree

12 files changed

+73
-110
lines changed

12 files changed

+73
-110
lines changed

docs/asciidoc/servers.adoc

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,19 @@ server.ssl.type = self-signed
101101
=== SSL
102102

103103
Jooby supports HTTPS out of the box. By default HTTPS is disabled and all requests are served using
104-
HTTP. To enable HTTPS support, modify your configuration.
104+
HTTP. Jooby supports two certificate formats:
105105

106-
.SSL Options
106+
- PKCS12 (this is the default format)
107+
- X.509
108+
109+
The javadoc:SslOptions[] class provides options to configure SSL:
110+
111+
- cert: A PKCS12 or X.509 certificate chain file in PEM format. It can be an absolute path or a classpath resource. Required.
112+
- key: A PKCS#8 private key file in PEM format. It can be an absolute path or a classpath resource. Required when using X.509 certificates.
113+
- password: Password to use (if any). Optional. Default is: null/empty.
114+
115+
116+
.Hello HTTPS
107117
[source,java,role="primary"]
108118
----
109119
{
@@ -133,22 +143,30 @@ listening on:
133143
https://localhost:8443/
134144
----
135145

136-
The `self-signed` certificate is useful for development and only works for `localhost`.
146+
[IMPORTANT]
147+
====
148+
The `self-signed` certificate is useful for development but keep in mind it will generate a warning on the browser.
149+
====
137150

138-
Jooby supports two certificate formats:
151+
image::self-signed-not-secure.png[Not Secure]
139152

140-
- PKCS12 (this is the default format)
141-
- X.509
153+
A better option for development is the https://mkcert.dev[mkcert] tool:
142154

143-
The javadoc:SslOptions[] class provides options to configure SSL:
155+
.Generates a PKCS12 certificate
156+
[source,bash,role="primary]
157+
----
158+
mkcrt -pkcs12 localhost
159+
----
144160

145-
- cert: A PKCS12 or X.509 certificate chain file in PEM format. It can be an absolute path or a classpath resource. Required.
146-
- key: A PKCS#8 private key file in PEM format. It can be an absolute path or a classpath resource. Required when using X.509 certificates.
147-
- password: Password to use (if any). Optional. Default is: null/empty.
161+
.Generates a X.509 certificate
162+
[source,bash,role="secondary"]
163+
----
164+
mkcrt localhost
165+
----
148166

149167
==== Using X.509
150168

151-
It is also possible to configure Jooby to use a X.509 certificate, for example one created with https://letsencrypt.org/[Let’s Encrypt]. You will need the `*.crt` and `*.key` files:
169+
To use a valid X.509 certificate, for example one created with https://letsencrypt.org/[Let’s Encrypt]. You will need the `*.crt` and `*.key` files:
152170

153171
.X509
154172
[source,java,role="primary"]
@@ -211,7 +229,7 @@ server {
211229

212230
==== Using PKCS12
213231

214-
It is also possible to configure Jooby to use a PKCS12 certificate:
232+
To use a valid PKCS12 certificate:
215233

216234
.PKCS12
217235
[source,java,role="primary"]
30.7 KB
Loading

examples/src/main/java/examples/HttpsApp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class HttpsApp extends Jooby {
1515
before(new SSLHandler(true));
1616
setServerOptions(new ServerOptions().setSecurePort(8443));
1717

18-
get("/secure", ctx -> {
18+
get("/", ctx -> {
1919
return ctx.getScheme() + "; secure: " + ctx.isSecure();
2020
});
2121
}
Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,15 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIEFzCCAn+gAwIBAgIQA3YJ+Gd4FXMkJneG0oKK/DANBgkqhkiG9w0BAQsFADBd
3-
MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExGTAXBgNVBAsMEGVkZ2Fy
4-
QG1lbWEubG9jYWwxIDAeBgNVBAMMF21rY2VydCBlZGdhckBtZW1hLmxvY2FsMB4X
5-
DTE5MDYwMTAwMDAwMFoXDTI5MTAwOTIxNDI0N1owRDEnMCUGA1UEChMebWtjZXJ0
6-
IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMRkwFwYDVQQLDBBlZGdhckBtZW1hLmxv
7-
Y2FsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5SgWtnDUUViRrdZw
8-
FtveKe6Uf8hMSC/vo/0EktsfaBnc5+Ze8wU15glbByAfdn4nz0Y37BmPA4304hCO
9-
lVPCa+OOLTA9Wy2ThccsVKaevtvuETnIoIqGTK8hRzNhpR7yw0wfwGMJZM22tVGj
10-
5zZrJNEzo+pe4iPSDw84hEEhMwpAf9QZRPpuxysD9j6n559nSgH9qAUa4B6PZf56
11-
LL4bCo+/J4UHrWnc+8HHFpc4FYpOlrMx0xtHWdXsL+v3O1hfaxY9sbLs8ey6tgiK
12-
RmJP3PhslJkxbMLsZR62NP7t9/ij70A6OnPJ1rDm44veqHNqIWSWAk++J6WEoijI
13-
yyP3qwIDAQABo2wwajAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
14-
AwEwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSgkoZtu34X+bqFqlZefmV9WyWU
15-
ZjAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJKoZIhvcNAQELBQADggGBAJ533IdG
16-
m+KLAcO5OmmQjSLUj+r10VU0+YpqCDSTu0SPzzSTfQK5C91tZaEIDekI2TA5rgoy
17-
lcMsMCDypFuUSAvcqRmCFBbdLGmbhKtOY6/ty98IWMHA/xpX3SryPTELQGVTfH+4
18-
8/PSkARWfwhyNlVclQYMX5SDoM49U7XEDxTd1UesvBEk2LRxZ5YH4J8nJRMMI1ST
19-
PJntCSaD05wo703lrxvLXU7eLQAWbRrUz/sxjEaam2lf9kvtUtvJdI9hEnTL9Pd8
20-
Nn+EIngTYVqR5pYxpdzzwzRR2lzwWL5My+z4NwcZweGlksLaow/dglpeu68t/jOp
21-
DC/eBVOok+vUGPX3+Jf6D/VBSzDfYnnWAI/0eukljENfaa3A+T39NG9gTtCORxin
22-
0syJWhqvdwPyaPNVQiJrPsHKWFmrcOMNutijy9gqnLC6F+JBBOvyHLHNWUW6iGai
23-
oMQenJE0oeSifW5dZ0WWuq+qcsXJuddEhQKsi8wK41cAwyIc4nTXYjPkAw==
2+
MIICqzCCAZOgAwIBAgIJANequC4DK++VMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNVBAMTCWxvY2Fs
3+
aG9zdDAgFw0xODExMDUyMzM3MTVaGA85OTk5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJbG9jYWxo
4+
b3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqjsyE1+40JMEXTeZ58ffSc5zaYPF
5+
32UMU7tYLubwajh4uARcEDczM8FqdiakwhUozRuW6KfTnR/awdFE099UHhW0/imd7HQrKQFlunTe
6+
UlfJ2ERZuN7ohIcYaTUSDAhYHEtZPv6m3rvE8xYuq2QCK7GCHhDe07FcIyIx92Gf6pWkmNDIgBlS
7+
EzYSbwwS8M4dm7kQATAT4MDvn9dx0Cr7UejasHRs9idlg3xwjj8UMqYC/Al+Hmk0SSgsRCEPELZu
8+
MqfXjZhOAXOs9Tgc+DMwfsCZM+X7X1gAoGalUxctdRLFnS13DUNoEUMh0uyDTO0btWnueDMPhttP
9+
kR8v5QqmzwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBbWgJjr+nbt/dd9w/MfY0Szsrz4Tscu1p+
10+
A+WxpWLMNjKztCWGtMo+PcUl3vNERIykefx70wDlfsaYPoOMBJU05BDCSMEkVpX8VZeV8YWaDLSp
11+
KG+RtWwk8PRihe/ADODZwRGVcDhQq2/wsFM28Rd1GcnD54+IvkV46WPUYwPthd0Kfj38Cx3S9tN4
12+
mUC2AzVcvmJl9Aj+YdAJ6BQ5MemgLaWIJwiPgCbGg8AIXFi51aq6xJNX6jFfcYgSFHD25mMuEWEz
13+
sbAj5kjKQUZLhXVDYoNfSCU3K5uYyDFUa7uyhvxVHjJWdlLRB8IsuPSncXgXNot4kp/0W19xaF4j
14+
xwtm
2415
-----END CERTIFICATE-----
Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
-----BEGIN PRIVATE KEY-----
2-
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDlKBa2cNRRWJGt
3-
1nAW294p7pR/yExIL++j/QSS2x9oGdzn5l7zBTXmCVsHIB92fifPRjfsGY8DjfTi
4-
EI6VU8Jr444tMD1bLZOFxyxUpp6+2+4ROcigioZMryFHM2GlHvLDTB/AYwlkzba1
5-
UaPnNmsk0TOj6l7iI9IPDziEQSEzCkB/1BlE+m7HKwP2Pqfnn2dKAf2oBRrgHo9l
6-
/nosvhsKj78nhQetadz7wccWlzgVik6WszHTG0dZ1ewv6/c7WF9rFj2xsuzx7Lq2
7-
CIpGYk/c+GyUmTFswuxlHrY0/u33+KPvQDo6c8nWsObji96oc2ohZJYCT74npYSi
8-
KMjLI/erAgMBAAECggEBAJAb29yzq/HUHxkRZ8AYWOhJzz1kuwQSkUOxlDS+dEvF
9-
J/T2HPP7bN/TNlmOy/p6b5Kb+AMUN6nmlf+spd4mpHewzPKCCbPTP5i7npdFiUNB
10-
j79pdU/wjXCgGe9q0pdClSxYLQeRwJCSBbqVMtvujwbCQRVuCGlyWWF7EvGo+7Xa
11-
JdeRtkoxzE1wRjEUke0XkyZMtt8sCd4XQ4bPJJRmYodSO0V+RXa2mb3i2iGYWcv7
12-
/eOKVGlRG1yRD0czEb7SuWLH/rSAnJsibRUMa4TcGaG287B9mcRxZRvNBKNMrSjN
13-
2e1Fep6YTgKLOyTYdIZtg24JaUddcrgvECAsxHFWNCECgYEA+gdbjN93Ocd1xI8L
14-
fJhLxh/eAbJVsYuOAh9gFAvko+l2NVeAjoAThaN+Q6iE9Til2dEgfN4dE9VQ9XhC
15-
iAFAMiK4vVQw8bUmJtwa3LcTD86n506aJlpONPt5E6Su+UKQbHM1y2CGBc2uCA75
16-
qlGmt35G4cvP1vPXr+g7nC993fkCgYEA6qEfIPnK3zxHXm1hvJLcatPNQ8CyE2/p
17-
uexsgxn8avTk5gepqv/ea2R1mkkSoA7PJsu1artkBAB5HPqB9fq/MJ13ZOHw1kfZ
18-
vq0vGy87lOS7M0XdMGcfpZQLuWUowjM4eIMDg5wOgkmgtMQGtf32dvXF8KIj3GJd
19-
3GIwoInXu8MCgYB1GZkRI2ANmZNYmb5BfnqOskIh/UoRO1EpQVSYTvGoqyEH3pGB
20-
LA74mhf6zCRpTTywBTf4A3cO4Otn7AkM9bkBQi3PzmyV58eUj6WtFblBwAH3XWLo
21-
74aNXfHY91pTt484m8ToGa7rbOdDMvBPiqpQaj38Zp5TCCVOZ6/zeHK00QKBgQC9
22-
O8/4b57g5yQEk6HFTol5m3OtFmhJZvSSII3wOvArb3KB2GJOaWmBIhf7pL3h26/V
23-
cWzTNWnYFG2aIqzYsDCtTAM0mUn9+Rs0P0eD3FdoogYdt1ZLKJEMoVfHYkA6SMdd
24-
4wTdi+rjx/BWeteSxs6WaWkIyCy2HZvoGEVx5VraswKBgQD2+8g3Cn3hUdg4FyfV
25-
gT/iX61THI6U+dbYVw+ELVNqh3zuThHwk9uiJantdS8a+fk80/ZW27VIkHXnC+3X
26-
3nOa6B1cUiItVCNF2S0kkuXec//+2Em0Ps9PP4jjJsg3GhztOUT7IMwG2Q7gFr1t
27-
8V+FHUhosyxgWpnkh0nIQSuniQ==
2+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCqOzITX7jQkwRdN5nnx99JznNp
3+
g8XfZQxTu1gu5vBqOHi4BFwQNzMzwWp2JqTCFSjNG5bop9OdH9rB0UTT31QeFbT+KZ3sdCspAWW6
4+
dN5SV8nYRFm43uiEhxhpNRIMCFgcS1k+/qbeu8TzFi6rZAIrsYIeEN7TsVwjIjH3YZ/qlaSY0MiA
5+
GVITNhJvDBLwzh2buRABMBPgwO+f13HQKvtR6NqwdGz2J2WDfHCOPxQypgL8CX4eaTRJKCxEIQ8Q
6+
tm4yp9eNmE4Bc6z1OBz4MzB+wJkz5ftfWACgZqVTFy11EsWdLXcNQ2gRQyHS7INM7Ru1ae54Mw+G
7+
20+RHy/lCqbPAgMBAAECggEAc0ITPKTiCG6SVN8xmIput5VN9VIgJopPV14Qbek1PGYx7j4da2lE
8+
hLVfdNHjWfljn8QfYDVJhSgtQG+Fj4K1fI0r966L264oDuKAU0ePw+bmpkRZD1/1xM2HjKw/JOB9
9+
b+LgcVOP/lzaE9CgFrFm+th8BglcJa7/eFZNyHZUBUri/IBWuPczFlIrc5HKIlPVM8Bf4E9nLtLj
10+
90Gg5zuNHvmN4+gIig8kEhTbWFKL/L+8adElOO22jvJMC3cBMhrbtD5K73wQ50MbSglhHP7PY4Uq
11+
asR0CQu6tKhLyLni4tlWMiEAs8b7IsG7BIkeD7UUKX7PVoCay9vJLvYL9qOyMQKBgQDilmnfAK/J
12+
mVVWCRfj1kgkBAIgswH49c+UCz0U6EzpNFXxhkEnuP0yvMrFCKEXXOP6J8WqgDJ3bWJQHARLbhfd
13+
p4VzWbwHH0V+4IaoYdX8uhxoyW/PNoqvla8233REWMQcbYBVvPtlygmbswgBmNMA2t6cIGcdmxkY
14+
P+fTWUkNtwKBgQDAVAqHBSxd8SZ+WG9fCjJM1Yjo3908ANNCucDw7cXHs0zJOrB2DV5FZG6iZNev
15+
MjfKSvVx7qe55SGpJWl8aDpvJ/df6tPD1SLRLuM54IdN3c3B0bt8Vn77mMASPz3hnK8SKsJ9LFoh
16+
dPbbAaHJjhlVIymIjhX6+dx11CvzSBQvqQKBgQCtRH3zBHBoBfPGla+KDzsdJ1+FJ72zZiz0tV9h
17+
FH5zugyaY6KBQKmF2e5omz+sQOEoUq+JwPxWbPPH9JSoJajkW4zl91GcVKJs8j6mliHvX1YIHzl7
18+
x+ZnfFv+5wLenM5iOq3vYlMPtF6CjHXr2rRHrBacZv7TGd4nt/6LlHQTowKBgQCXt/RSDOex99Eo
19+
7DR3IcEKUYzeP/LzKad+RLCKntddsPjK6UxY5DTQwuhvnON0ZkYSg81Zoi2X/MPv/f5X0JUAKOQB
20+
O2rwWktL/xPrDU9PQsDUu9GNxWIIsbga7N6xAnws9aRVQE6dg/pUS9ZH/JvJSKK0AXofcUnTfZtq
21+
IBskeQKBgQCerwVey5BIjiePoeikal/BiNwLgjeOSPax6qs4/9wRDXnN/Qj3q486pXy4OohhIeXc
22+
G7aeI3PACO/a680Mtbzi3q/1PsHWuuWrIzin3kF0ri8X3pYrzyV2rwmJqe1HmmBKOVPEg/KtHwpW
23+
ORBoSiB2Hz9RmSdyBUK1grLz3GJNXQ==
2824
-----END PRIVATE KEY-----
-1.56 KB
Binary file not shown.

modules/jooby-jetty/src/main/java/io/jooby/internal/jetty/JettyContext.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package io.jooby.internal.jetty;
77

8-
import com.typesafe.config.Config;
98
import io.jooby.Body;
109
import io.jooby.ByteRange;
1110
import io.jooby.Context;
@@ -27,7 +26,6 @@
2726
import io.jooby.Value;
2827
import io.jooby.ValueNode;
2928
import io.jooby.WebSocket;
30-
import org.eclipse.jetty.http.HttpContent;
3129
import org.eclipse.jetty.http.HttpFields;
3230
import org.eclipse.jetty.http.HttpHeader;
3331
import org.eclipse.jetty.http.HttpHeaderValue;
@@ -39,8 +37,6 @@
3937
import org.eclipse.jetty.util.BufferUtil;
4038
import org.eclipse.jetty.util.Callback;
4139
import org.eclipse.jetty.util.MultiMap;
42-
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
43-
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
4440
import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
4541
import org.slf4j.Logger;
4642

@@ -49,7 +45,6 @@
4945
import javax.servlet.AsyncContext;
5046
import javax.servlet.MultipartConfigElement;
5147
import javax.servlet.ServletException;
52-
import javax.servlet.ServletOutputStream;
5348
import javax.servlet.WriteListener;
5449
import javax.servlet.http.Part;
5550
import java.io.FileInputStream;
@@ -71,8 +66,6 @@
7166
import java.util.List;
7267
import java.util.Map;
7368
import java.util.concurrent.Executor;
74-
import java.util.concurrent.TimeUnit;
75-
import java.util.concurrent.atomic.AtomicBoolean;
7669

7770
import static org.eclipse.jetty.http.HttpHeader.CONTENT_TYPE;
7871
import static org.eclipse.jetty.http.HttpHeader.SET_COOKIE;

tests/src/test/java/io/jooby/FeaturedTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import okhttp3.Response;
2020
import okhttp3.ResponseBody;
2121
import org.junit.jupiter.api.DisplayName;
22+
import org.junit.jupiter.api.RepeatedTest;
2223
import org.junit.jupiter.api.Test;
2324
import reactor.core.publisher.Flux;
2425
import reactor.core.publisher.Mono;
@@ -1890,6 +1891,7 @@ public void sessionIdMultiple() {
18901891
assertNotNull(sid);
18911892
String header = rsp.header("TOKEN");
18921893
assertNotNull(header);
1894+
assertEquals(sid, header);
18931895

18941896
client.header("Cookie", "jooby.sid=" + sid);
18951897
client.get("/session", sessionCookie -> {
@@ -1905,7 +1907,7 @@ public void sessionIdMultiple() {
19051907
assertNull(headerCookie.header("Set-Cookie"));
19061908
});
19071909
});
1908-
});
1910+
}, Jetty::new);
19091911
}
19101912

19111913
@Test
@@ -2916,7 +2918,8 @@ public void jsonwebtokenSession() {
29162918
});
29172919

29182920
app.get("/destroy", ctx -> {
2919-
ctx.session().destroy();;
2921+
ctx.session().destroy();
2922+
;
29202923
return "destroy";
29212924
});
29222925
}).ready(client -> {
@@ -2981,7 +2984,7 @@ private byte[][] partition(byte[] bytes, int size) {
29812984
List<byte[]> result = new ArrayList<>();
29822985
int offset = 0;
29832986
while (offset < bytes.length) {
2984-
int len = Math.min(size,bytes.length - offset);
2987+
int len = Math.min(size, bytes.length - offset);
29852988
byte[] b = new byte[len];
29862989
System.arraycopy(bytes, offset, b, 0, len);
29872990
result.add(b);

tests/src/test/java/io/jooby/WebClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.jooby;
22

3+
import okhttp3.Cache;
34
import okhttp3.Headers;
45
import okhttp3.OkHttpClient;
56
import okhttp3.RequestBody;

tests/src/test/resources/localhost.crt

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)