Skip to content

Commit 47f58d2

Browse files
committed
port over LetsEncrypt root certificate fix from ArchaicFix
1 parent 1c643e2 commit 47f58d2

File tree

6 files changed

+138
-0
lines changed

6 files changed

+138
-0
lines changed

src/main/java/com/falsepattern/lib/internal/asm/CoreLoadingPlugin.java

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.falsepattern.lib.internal.FPLog;
2626
import com.falsepattern.lib.internal.Tags;
2727
import com.falsepattern.lib.internal.impl.dependencies.DependencyLoaderImpl;
28+
import com.falsepattern.lib.internal.impl.dependencies.LetsEncryptHelper;
2829
import com.falsepattern.lib.internal.logging.CrashImprover;
2930
import com.falsepattern.lib.internal.logging.NotEnoughVerbosity;
3031
import com.falsepattern.lib.mapping.MappingManager;
@@ -62,6 +63,7 @@ public class CoreLoadingPlugin implements IFMLLoadingPlugin {
6263
private static boolean obfuscated;
6364

6465
static {
66+
LetsEncryptHelper.replaceSSLContext();
6567
FPLog.LOG.info("Removing skill issues...");
6668
try {
6769
Class.forName("thermos.Thermos");

src/main/java/com/falsepattern/lib/internal/asm/RFBLoadingPlugin.java

+2
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525

2626
import com.falsepattern.lib.internal.core.LowLevelCallMultiplexer;
2727
import com.falsepattern.lib.internal.impl.dependencies.DependencyLoaderImpl;
28+
import com.falsepattern.lib.internal.impl.dependencies.LetsEncryptHelper;
2829
import com.gtnewhorizons.retrofuturabootstrap.api.RfbPlugin;
2930

3031
public class RFBLoadingPlugin implements RfbPlugin {
3132
static {
33+
LetsEncryptHelper.replaceSSLContext();
3234
LowLevelCallMultiplexer.rfbDetected();
3335
DependencyLoaderImpl.executeDependencyLoading(false);
3436
}

src/main/java/com/falsepattern/lib/internal/config/EarlyConfig.java

+5
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ public class EarlyConfig {
5050
@StableAPI.Expose(since = "__INTERNAL__")
5151
private boolean enableLibraryDownloads;
5252

53+
@Expose
54+
@StableAPI.Expose(since = "__INTERNAL__")
55+
private boolean enableLetsEncryptRoot;
56+
5357
private static volatile EarlyConfig instance = null;
5458

5559
private static final Logger LOG = LogManager.getLogger(Tags.MODNAME + " Early Config");
@@ -83,6 +87,7 @@ public class EarlyConfig {
8387
if (config == null) {
8488
config = new EarlyConfig();
8589
config.enableLibraryDownloads(true);
90+
config.enableLetsEncryptRoot(true);
8691
try {
8792
Files.write(configFile, gson.toJson(config).getBytes(StandardCharsets.UTF_8));
8893
} catch (IOException e) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* This file is part of FalsePatternLib.
3+
*
4+
* Copyright (C) 2022-2024 FalsePattern
5+
* All Rights Reserved
6+
*
7+
* The above copyright notice and this permission notice shall be included
8+
* in all copies or substantial portions of the Software.
9+
*
10+
* FalsePatternLib is free software: you can redistribute it and/or modify
11+
* it under the terms of the GNU Lesser General Public License as published by
12+
* the Free Software Foundation, either version 3 of the License, or
13+
* (at your option) any later version.
14+
*
15+
* FalsePatternLib is distributed in the hope that it will be useful,
16+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18+
* GNU Lesser General Public License for more details.
19+
*
20+
* You should have received a copy of the GNU Lesser General Public License
21+
* along with FalsePatternLib. If not, see <https://www.gnu.org/licenses/>.
22+
*/
23+
24+
package com.falsepattern.lib.internal.impl.dependencies;
25+
26+
import com.falsepattern.lib.internal.FPLog;
27+
import com.falsepattern.lib.internal.config.EarlyConfig;
28+
import lombok.val;
29+
30+
import javax.net.ssl.SSLContext;
31+
import javax.net.ssl.TrustManagerFactory;
32+
import java.io.IOException;
33+
import java.nio.file.Files;
34+
import java.nio.file.Paths;
35+
import java.security.GeneralSecurityException;
36+
import java.security.KeyStore;
37+
import java.security.cert.CertificateFactory;
38+
39+
/**
40+
* Add Let's Encrypt root certificates to the default SSLContext.
41+
* CurseForge launcher uses the vanilla JDK for 1.7.10, which is version 8u51.
42+
* This version does not include these certificates, support for ISRG Root X1 was added in 8u141.
43+
* Based on <a href="https://github.com/Cloudhunter/LetsEncryptCraft/blob/2471391f7d081a8b7faed9e22051cab6352966fe/src/main/java/uk/co/cloudhunter/letsencryptcraft/LetsEncryptAdder.java">LetsEncryptCraft</a> by Cloudhunter (MIT)
44+
*/
45+
public class LetsEncryptHelper {
46+
private static volatile boolean patched = false;
47+
private LetsEncryptHelper() {}
48+
@SuppressWarnings("java:S6437")
49+
public static void replaceSSLContext() {
50+
if (!EarlyConfig.getInstance().enableLetsEncryptRoot()) {
51+
return;
52+
}
53+
if (patched) {
54+
return;
55+
}
56+
patched = true;
57+
58+
try (val x1 = LetsEncryptHelper.class.getResourceAsStream("/letsencrypt/isrgrootx1.pem");
59+
val x2 = LetsEncryptHelper.class.getResourceAsStream("/letsencrypt/isrg-root-x2.pem")) {
60+
val merged = KeyStore.getInstance(KeyStore.getDefaultType());
61+
val cacerts = Paths.get(System.getProperty("java.home"),"lib", "security", "cacerts");
62+
merged.load(Files.newInputStream(cacerts), "changeit".toCharArray());
63+
64+
val cf = CertificateFactory.getInstance("X.509");
65+
66+
val cx1 = cf.generateCertificate(x1);
67+
merged.setCertificateEntry("archaicfix-isrgx1", cx1);
68+
69+
val cx2 = cf.generateCertificate(x2);
70+
merged.setCertificateEntry("archaicfix-isrgx2", cx2);
71+
72+
val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
73+
tmf.init(merged);
74+
val sslContext = SSLContext.getInstance("TLS");
75+
sslContext.init(null, tmf.getTrustManagers(), null);
76+
SSLContext.setDefault(sslContext);
77+
FPLog.LOG.info("[LetsEncryptHelper] Added certificates to trust store.");
78+
} catch (IOException e) {
79+
FPLog.LOG.error("[LetsEncryptHelper] Failed to load certificates from classpath.", e);
80+
} catch (GeneralSecurityException e) {
81+
FPLog.LOG.error("[LetsEncryptHelper] Failed to load default keystore.", e);
82+
}
83+
}
84+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
3+
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
4+
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
5+
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
6+
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
7+
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
8+
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
9+
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
10+
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
11+
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
12+
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
13+
/q4AaOeMSQ+2b1tbFfLn
14+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
3+
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
4+
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
5+
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
6+
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
7+
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
8+
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
9+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
10+
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
11+
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
12+
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
13+
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
14+
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
15+
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
16+
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
17+
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
18+
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
19+
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
20+
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
21+
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
22+
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
23+
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
24+
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
25+
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
26+
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
27+
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
28+
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
29+
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
30+
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
31+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)