yangys
2024-03-04 c51a042cfb8453265acf2b764b82bd17019b9b1b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.qianwen.mdc.service.opcua;
 
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.regex.Pattern;
import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil;
import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder;
import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
@Component
public class KeyStoreLoader {
  public KeyStoreLoader load(Path baseDir) throws Exception {
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    Path serverKeyStore = baseDir.resolve("opcua-client.pfx");
    this.logger.info("Loading KeyStore at {}", serverKeyStore);
    if (!Files.exists(serverKeyStore, new java.nio.file.LinkOption[0])) {
      keyStore.load(null, PASSWORD);
      KeyPair keyPair = SelfSignedCertificateGenerator.generateRsaKeyPair(2048);
      SelfSignedCertificateBuilder builder = (new SelfSignedCertificateBuilder(keyPair)).setCommonName("mdc").setOrganization("hx").setOrganizationalUnit("Kx").setLocalityName("Terran").setStateName("Shanghai").setCountryCode("CN").setApplicationUri("urn:eclipse:milo:examples:client").addDnsName("localhost").addIpAddress("127.0.0.1");
      for (String hostname : HostnameUtil.getHostnames("0.0.0.0")) {
        if (IP_ADDR_PATTERN.matcher(hostname).matches()) {
          builder.addIpAddress(hostname);
          continue;
        } 
        builder.addDnsName(hostname);
      } 
      X509Certificate certificate = builder.build();
      keyStore.setKeyEntry("hx-mdc", keyPair.getPrivate(), PASSWORD, (Certificate[])new X509Certificate[] { certificate });
      try (OutputStream out = Files.newOutputStream(serverKeyStore, new java.nio.file.OpenOption[0])) {
        keyStore.store(out, PASSWORD);
      } 
    } else {
      try (InputStream in = Files.newInputStream(serverKeyStore, new java.nio.file.OpenOption[0])) {
        keyStore.load(in, PASSWORD);
      } 
    } 
    Key serverPrivateKey = keyStore.getKey("hx-mdc", PASSWORD);
    if (serverPrivateKey instanceof PrivateKey) {
      this.clientCertificate = (X509Certificate)keyStore.getCertificate("hx-mdc");
      PublicKey serverPublicKey = this.clientCertificate.getPublicKey();
      this.clientKeyPair = new KeyPair(serverPublicKey, (PrivateKey)serverPrivateKey);
    } 
    return this;
  }
  
  public X509Certificate getClientCertificate() {
    return this.clientCertificate;
  }
  
  public KeyPair getClientKeyPair() {
    return this.clientKeyPair;
  }
  
  private static final Pattern IP_ADDR_PATTERN = Pattern.compile("^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
  
  private static final String CLIENT_ALIAS = "hx-mdc";
  
  private static final char[] PASSWORD = "12345678".toCharArray();
  
  private final Logger logger = LoggerFactory.getLogger(getClass());
  
  private X509Certificate clientCertificate;
  
  private KeyPair clientKeyPair;
}