Skip to content

Commit 2cd7305

Browse files
authored
Merge pull request #40 from c-jimenez/releases/v0.5.0
Releases/v0.5.0
2 parents e718e64 + ccdd7eb commit 2cd7305

File tree

196 files changed

+9673
-548
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

196 files changed

+9673
-548
lines changed

CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,13 @@ if(NOT DEFINED TARGET)
1515
endif()
1616
include(CMakeLists_${TARGET}.txt)
1717

18-
# Subdirectories
18+
# 3rd party
1919
add_subdirectory(3rdparty)
20+
21+
# OpenSSL is mandatory
22+
find_package(OpenSSL REQUIRED COMPONENTS SSL Crypto)
23+
24+
# Subdirectories
2025
add_subdirectory(examples)
2126
add_subdirectory(src)
2227

README.md

Lines changed: 136 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44
This implementation targets only the Websocket/JSON version of this protocol.
55

66
This implementation is based on the following libraries :
7+
* [OpenSSL](https://www.openssl.org) : TLS communications + certificates management
78
* [libwebsockets](https://libwebsockets.org) : Websocket layer
8-
* [OpenSSL](https://www.openssl.org) : TLS communications
99
* [SQLite](https://www.sqlite.org/) : Database / persistency
1010
* [rapidjson](https://rapidjson.org/) : JSON serialization/deserialization
1111
* [doctest](https://github.com/doctest/doctest) : Unit tests
1212

1313
## Table of contents
1414

1515
* [Features](#features)
16+
+ [Key features](#key-features)
17+
+ [Supported OCPP feature profiles](#supported-ocpp-feature-profiles)
18+
+ [Supported OCPP configuration keys](#supported-ocpp-configuration-keys)
19+
+ [OCPP security extensions](#ocpp-security-extensions)
20+
* [Internal configuration keys](#internal-configuration-keys)
1621
* [Build](#build)
1722
* [Quick start](#quick-start)
1823
+ [Charge Point role](#charge-point-role)
@@ -32,9 +37,9 @@ This implementation is based on the following libraries :
3237

3338
As of this version :
3439

35-
* No Charge Point nor Central System behavior related to the OCPP 1.6 security whitepaper edition 2 has been implemented (work in progress)
3640
* All the messages defined in the OCPP 1.6 edition 2 protocol have been implemented except GetCompositeSchedule for Charge Point role
3741
* All the configuration keys defined in the OCPP 1.6 edition 2 protocol have been implemented for the Charge Point role
42+
* Most of Charge Point and Central System behavior related to the OCPP 1.6 security whitepaper edition 2 has been implemented (work in progress, see [OCPP security extensions](#ocpp-security-extensions))
3843

3944
The user application will have to implement some callbacks to provide the data needed by **Open OCPP** or to handle OCPP events (boot notification, remote start/stop notifications, meter values...).
4045

@@ -47,6 +52,7 @@ The persistent data handled by **Open OCPP** is stored into a single file which
4752
+ Badge cache and local list
4853
+ Smart charging profile
4954
+ Logs
55+
* X.509 Certificates
5056

5157
* For Central System role :
5258

@@ -63,10 +69,12 @@ The standard OCPP configuration persistency has to be handled by the user applic
6369
| Firmware Management | Support for firmware update management and diagnostic log file download | Actual file download/upload as well as firmware installation must be handled by the user application in the callbacks provided by **Open OCPP** |
6470
| Local Auth List Management | Features to manage the local authorization list in Charge Points | None |
6571
| Reservation | Support for reservation of a Charge Point. | None |
66-
| Smart Charging | Support for basic Smart Charging, for instance using control pilot | GetCompositeSchedule is not supported for now in Chare Point role |
72+
| Smart Charging | Support for basic Smart Charging, for instance using control pilot | GetCompositeSchedule is not supported for now in Charge Point role |
6773
| Remote Trigger | Support for remote triggering of Charge Point initiated messages | None |
6874

69-
### Supported OCPP configuration keys (Charge Point role)
75+
### Supported OCPP configuration keys
76+
77+
The OCPP configuration keys support applies to Charge Point role only.
7078

7179
In the "Owner" column, "S" means that the configuration key behavior is handled by the stack, "U" means that it must handled by the user application.
7280

@@ -80,7 +88,7 @@ In the "Owner" column, "S" means that the configuration key behavior is handled
8088
| ConnectionTimeOut | S | None |
8189
| ConnectorPhaseRotation | S | None |
8290
| ConnectorPhaseRotationMaxLength | S | None |
83-
| GetConfigurationMaxKeys | S | Must be set to the sum of OCPP configuration keys count (99) + user application configuration keys count to allow to export all the configuration in 1 message |
91+
| GetConfigurationMaxKeys | S | Must be set to the sum of OCPP configuration keys count (49) + user application configuration keys count to allow to export all the configuration in 1 message |
8492
| HeartbeatInterval | S | Heartbeat are only sent if no messages have been exchanged since HeartbeatInterval seconds |
8593
| LightIntensity | U | None |
8694
| LocalAuthorizeOffline | S | None |
@@ -115,12 +123,130 @@ In the "Owner" column, "S" means that the configuration key behavior is handled
115123
| ChargingScheduleMaxPeriods | S | None |
116124
| ConnectorSwitch3to1PhaseSupported | S | None |
117125
| MaxChargingProfilesInstalled | S | None |
118-
| AdditionalRootCertificateCheck | S | OCPP 1.6 security whitepaper edition 2 configuration key : not implemented yet |
126+
| AdditionalRootCertificateCheck | U/S | Not implemented yet : implemented behavior is the same as if AdditionalRootCertificateCheck = False |
119127
| AuthorizationKey | S | None |
120-
| CertificateSignedMaxChainSize | S | OCPP 1.6 security whitepaper edition 2 configuration key : not implemented yet |
121-
| CertificateStoreMaxLength | S | OCPP 1.6 security whitepaper edition 2 configuration key : not implemented yet |
122-
| CpoName | S | OCPP 1.6 security whitepaper edition 2 configuration key : not implemented yet |
123-
| SecurityProfile | S | OCPP 1.6 security whitepaper edition 2 configuration key : not implemented yet |
128+
| CertificateSignedMaxChainSize | S | None |
129+
| CertificateStoreMaxLength | U/S | If internal certificate management is enabled, the stack handle this parameter, otherwise it must be the user application |
130+
| CpoName | S | None |
131+
| SecurityProfile | S | None |
132+
133+
### OCPP security extensions
134+
135+
#### Security profiles
136+
137+
**Open OCPP** support the following Security Profiles for both Charge Point and Central System roles :
138+
139+
* 0 : No security profile
140+
* 1 : Unsecured Transport with HTTP Basic Authentication
141+
* 2 : TLS with HTTP Basic Authentication
142+
* 3 : TLS with Client Side Certificates
143+
144+
In Charge Point role, the stack will automatically disconnect and then reconnect using the new parameters to the Central System after one of the following parameters has been modified :
145+
* **AuthorizationKey**
146+
* **Security Profile**
147+
148+
#### Security events
149+
150+
**Open OCPP** support the whole use cases of security events and logging.
151+
152+
In Charge Point role, it can optionnaly handle the storage of the security event log and the generation of the security log export when the Central System asks it. To enable/disable this feature, you have to modify the **SecurityLogMaxEntriesCount** charge point configuration key :
153+
154+
* 0 = **Open OCPP** will not store security event and the security log must be generated by the user application
155+
* \>0 = **Open OCPP** will store at max **SecurityLogMaxEntriesCount** (circular log) and will automatically generate the security log as a CSV file
156+
157+
In Charge Point role, the user application can generate custom security events and defines its criticity so that they are forwarded to the Central System.
158+
159+
In Charge Point role, the notification of security events can be enabled or disabled with the **SecurityEventNotificationEnabled** configuration key. This can be usefull to disable them when the Central System does not implement the security extensions.
160+
161+
#### Extended trigger messages
162+
163+
**Open OCPP** support this feature for both Charge Point and Central System roles.
164+
165+
#### Certificate management
166+
167+
**Open OCPP** support this feature for both Charge Point and Central System roles.
168+
169+
The behavior of this feature is controlled by the **InternalCertificateManagementEnabled** configuration key.
170+
171+
If **InternalCertificateManagementEnabled** is set to **false**, the actual storage of the certificates and their keys must be done by the user application. **Open OCPP** provides callbacks and helper classes to ease certificate manipulation and installation. The user application also has to configure the path to the installed certificates for the establishment of the secure connections using the following configuration keys :
172+
173+
* TlsServerCertificateCa
174+
* TlsClientCertificate
175+
* TlsClientCertificatePrivateKey
176+
* TlsClientCertificatePrivateKeyPassphrase
177+
178+
If **InternalCertificateManagementEnabled** is set to **true**, the storage of certificates and their keys is fully handled by **Open OCPP**. The user application just has to provide a passphrase using the **TlsClientCertificatePrivateKeyPassphrase** configuration key to securily encrypt the certicates' private keys using AES-256-CBC algorithm. **Open OCPP** will automatically use the installed corresponding certificates depending on the configured Security Profile and the certificates validity dates.
179+
180+
### Internal configuration keys
181+
182+
The behavior and the configuration of the **Open OCPP** stack can be modified through configuration keys. Some are specific to an OCPP role and some are common.
183+
184+
#### Common keys
185+
186+
| Key | Type | Description |
187+
| :---: | :---: | :--- |
188+
| DatabasePath | string | Path to the database to store persistent data |
189+
| JsonSchemasPath | string | Path to the JSON schemas to validate the messages |
190+
| CallRequestTimeout | uint | Call request timeout in milliseconds |
191+
| Tlsv12CipherList | string | List of authorized ciphers for TLSv1.2 connections (OpenSSL format) |
192+
| Tlsv13CipherList | string | List of authorized ciphers for TLSv1.3 connections (OpenSSL format) |
193+
| LogMaxEntriesCount | uint | Maximum number of entries in the log (0 = no logs in database) |
194+
195+
#### Charge Point keys
196+
197+
| Key | Type | Description |
198+
| :---: | :---: | :--- |
199+
| ConnexionUrl | string | URL of the Central System |
200+
| ChargePointIdentifier | string | OCPP Charge Point identifier. Will be concatanated with the **ConnexionUrl** key |
201+
| ConnectionTimeout | uint | Connection timeout in milliseconds |
202+
| RetryInterval | uint | Retry interval when connection has failed in milliseconds |
203+
| ChargeBoxSerialNumber | string | Deprecated. Charge Box serial number for BootNotification message |
204+
| ChargePointModel | string | Charge Point model for BootNotification message |
205+
| ChargePointSerialNumber | string | Charge Point serial number for BootNotification message |
206+
| ChargePointVendor | string | Charge Point vendor for BootNotification message |
207+
| FirmwareVersion | string | Charge Point firmware version for BootNotification message |
208+
| Iccid | string | ICCID of the moden's SIM card for BootNotification message |
209+
| Imsi | string | IMSI of the moden's SIM card for BootNotification message |
210+
| MeterSerialNumber | string | Main electrical meter serial number for BootNotification message |
211+
| MeterType | string | Main electrical meter type for BootNotification message |
212+
| OperatingVoltage | float | Nominal operating voltage (needed for Watt to Amp conversions in smart charging profiles) |
213+
| AuthentCacheMaxEntriesCount | uint | Maximum number of entries in the authentication cache |
214+
| TlsServerCertificateCa | string | Path to Certification Authority signing chain to validate the Central System certificate |
215+
| TlsClientCertificate | string | Path to Charge Point certificate |
216+
| TlsClientCertificatePrivateKey | string | Path to Charge Point's certificate's private key |
217+
| TlsClientCertificatePrivateKeyPassphrase | string | Charge Point certificate's private key passphrase |
218+
| TlsAllowSelfSignedCertificates | bool | Allow TLS connections using self-signed certificates (Warning : enabling this feature is not recommended in production) |
219+
| TlsAllowExpiredCertificates | bool | Allow TLS connections using expired certificates (Warning : enabling this feature is not recommended in production) |
220+
| TlsAcceptNonTrustedCertificates | bool | Accept non trusted certificates for TLS connections (Warning : enabling this feature is not recommended in production) |
221+
| TlsSkipServerNameCheck | bool | Skip server name check in certificates for TLS connections (Warning : enabling this feature is not recommended in production) |
222+
| InternalCertificateManagementEnabled | bool | If true, certificates are stored inside **Open OCPP** databasen otherwise user application has to handle them|
223+
| SecurityEventNotificationEnabled | bool | Enable security event notification |
224+
| SecurityLogMaxEntriesCount | uint | Maximum number of entries in the security log (0 = no security logs in database) |
225+
| ClientCertificateRequestHashType | string | Hash type for certificate request generation : sha256, sha384 or sha512 |
226+
| ClientCertificateRequestKeyType | string | Key type for certificate request generation : ec or rsa |
227+
| ClientCertificateRequestRsaKeyLength | uint | Length in bits of the key for certificate request generation if rsa has been selected for key type : minimum 2048 |
228+
| ClientCertificateRequestEcCurve | string | Name of the elliptic curve for certificate request generation if ec has been selected for key type : prime256v1, secp256k1, secp384r1, secp521r1, brainpoolP256t1, brainpoolP384t1 or brainpoolP512t1 |
229+
| ClientCertificateRequestSubjectCountry | string | Country for the subject field of certificate request generation (can be left empty) |
230+
| ClientCertificateRequestSubjectState | string | State for the subject field of certificate request generation (can be left empty) |
231+
| ClientCertificateRequestSubjectLocation | string | Location for the subject field of certificate request generation (can be left empty) |
232+
| ClientCertificateRequestSubjectOrganizationUnit | string | Organization unit for the subject field of certificate request generation (can be left empty) |
233+
| ClientCertificateRequestSubjectEmail | string | Email for the subject field of certificate request generation (can be left empty) |
234+
235+
#### Central System keys
236+
237+
| Key | Type | Description |
238+
| :---: | :---: | :--- |
239+
| ListenUrl | string | URL to listen to incomming websocket connections |
240+
| WebSocketPingInterval | uint | Websocket PING interval in seconds |
241+
| BootNotificationRetryInterval | uint | Boot notification retry interval in second (sent in BootNotificationConf when status is Pending or Rejected) |
242+
| HeartbeatInterval | uint | Heartbeat interval in seconds (sent in BootNotificationConf when status is Accepted) |
243+
| HttpBasicAuthent | bool | If set to true, the Charge Points must autenticate themselves using HTTP Basic Authentication method |
244+
| TlsEcdhCurve | string | ECDH curve to use for TLS connections with EC keys |
245+
| TlsServerCertificate | string | Path to the Central System's certificate |
246+
| TlsServerCertificatePrivateKey | string | Path to the Central System's certificate's private key |
247+
| TlsServerCertificatePrivateKeyPassphrase | string | Central System's certificate's private key passphrase |
248+
| TlsServerCertificateCa | string | Path to the Certification Authority signing chain for the Central System's certificate |
249+
| TlsClientCertificateAuthent | bool | If set to true, the Charge Points must authenticate themselves using an X.509 certificate |
124250

125251
## Build
126252

examples/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ add_subdirectory(common)
44
add_subdirectory(quick_start_centralsystem)
55
add_subdirectory(quick_start_chargepoint)
66
add_subdirectory(remote_chargepoint)
7+
add_subdirectory(security_centralsystem)
8+
add_subdirectory(security_chargepoint)

examples/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ The following examples are available :
66
* [Quick start Central System example](./quick_start_centralsystem/README.md)
77
* [Quick start Charge Point example](./quick_start_chargepoint/README.md)
88
* [Remote Charge Point example](./remote_chargepoint/README.md)
9+
* [Security Charge Point example](./security_chargepoint/README.md)
910

1011
How to run the examples:
1112
* Customize the *config.ini* file of the selected example with the URL of the Central System and the other connection parameters has well has the OCPP configuration keys

examples/certificates/open-ocpp_ca.cnf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ subjectAltName = @alt_names
2222

2323
[alt_names]
2424
DNS.1 = localhost
25-
DNS.2 = IP:127.0.0.1
25+
IP.1 = 127.0.0.1
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
-----BEGIN CERTIFICATE-----
2-
MIICfjCCAiSgAwIBAgIUROpklJY2B+02oFHz1MvijdkjtvgwCgYIKoZIzj0EAwIw
2+
MIICdjCCAhygAwIBAgIUU00opFUZAFZnWYQ+kgYIY/xRtrkwCgYIKoZIzj0EAwIw
33
gaMxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZTYXZvaWUxETAPBgNVBAcMCENoYW1i
44
ZXJ5MRIwEAYDVQQKDAlPcGVuIE9DUFAxETAPBgNVBAsMCEV4YW1wbGVzMSgwJgYD
55
VQQDDB9PcGVuIE9DUFAgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcN
6-
AQkBFhBjYUBvcGVuLW9jcHAub3JnMB4XDTIyMDEyNTA4MjQzM1oXDTMyMDEyMzA4
7-
MjQzM1owgaMxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZTYXZvaWUxETAPBgNVBAcM
6+
AQkBFhBjYUBvcGVuLW9jcHAub3JnMB4XDTIyMDEyODIyMTAwOVoXDTMyMDEyNjIy
7+
MTAwOVowgaMxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZTYXZvaWUxETAPBgNVBAcM
88
CENoYW1iZXJ5MRIwEAYDVQQKDAlPcGVuIE9DUFAxETAPBgNVBAsMCEV4YW1wbGVz
99
MSgwJgYDVQQDDB9PcGVuIE9DUFAgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJ
1010
KoZIhvcNAQkBFhBjYUBvcGVuLW9jcHAub3JnMFkwEwYHKoZIzj0CAQYIKoZIzj0D
11-
AQcDQgAEJZAFFCLPK7VimsLANzt6QEVVASRfqG+w6/oiCksM8l5/UkbtMi07Eum9
12-
IS1opxqsf5dPrGnLVz2wslSEsdHiaqM0MDIwDAYDVR0TBAUwAwEB/zAiBgNVHREE
13-
GzAZgglsb2NhbGhvc3SCDElQOjEyNy4wLjAuMTAKBggqhkjOPQQDAgNIADBFAiEA
14-
9Dwgm5x0hw+wRtek9UJ1aJdwmlVgHCeGqFUjwArjn1YCIES6iO0nG+sMMFhWdRHZ
15-
nmfCimIZKr/bIH6EefWzbg9s
11+
AQcDQgAELROcaZSbNQBW3xu4p6M38kFlL+nZvX+CCxZlZm8AYvT8CScbiEIhs4Yx
12+
pwPc7rw0Rg+ke+7mpiyVO6eckW8AA6MsMCowDAYDVR0TBAUwAwEB/zAaBgNVHREE
13+
EzARgglsb2NhbGhvc3SHBH8AAAEwCgYIKoZIzj0EAwIDSAAwRQIhAMnF/jvtMu9u
14+
LYlG6BtNb0QImbRACsJTvbc8vy0UWLqdAiA4SZLw3/jm6Wt0/KUBCauh9Q3ng4R7
15+
nra7+SE7jsfQGQ==
1616
-----END CERTIFICATE-----
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-----BEGIN EC PRIVATE KEY-----
2-
MHcCAQEEIDKwZrJhHkMw8cMAUNRgXzaFKlnimYYY8xB6ifuL/s4OoAoGCCqGSM49
3-
AwEHoUQDQgAEJZAFFCLPK7VimsLANzt6QEVVASRfqG+w6/oiCksM8l5/UkbtMi07
4-
Eum9IS1opxqsf5dPrGnLVz2wslSEsdHiag==
2+
MHcCAQEEIIaECY0903wV9XcY5RlURk0WsHpCL2n8B/VzUwZ1+TZpoAoGCCqGSM49
3+
AwEHoUQDQgAELROcaZSbNQBW3xu4p6M38kFlL+nZvX+CCxZlZm8AYvT8CScbiEIh
4+
s4YxpwPc7rw0Rg+ke+7mpiyVO6eckW8AAw==
55
-----END EC PRIVATE KEY-----

examples/certificates/open-ocpp_central-system.cnf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ subjectAltName = @alt_names
2222

2323
[alt_names]
2424
DNS.1 = localhost
25-
DNS.2 = IP:127.0.0.1
25+
IP.1 = 127.0.0.1
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
-----BEGIN CERTIFICATE-----
2-
MIICgDCCAiagAwIBAgIUE0SqeLRrvEnH5WWw36XvPEisumMwCgYIKoZIzj0EAwIw
2+
MIICeDCCAh6gAwIBAgIUE0SqeLRrvEnH5WWw36XvPEisumcwCgYIKoZIzj0EAwIw
33
gaMxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZTYXZvaWUxETAPBgNVBAcMCENoYW1i
44
ZXJ5MRIwEAYDVQQKDAlPcGVuIE9DUFAxETAPBgNVBAsMCEV4YW1wbGVzMSgwJgYD
55
VQQDDB9PcGVuIE9DUFAgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcN
6-
AQkBFhBjYUBvcGVuLW9jcHAub3JnMB4XDTIyMDEyNTA4MjQzM1oXDTMyMDEyMzA4
7-
MjQzM1owgagxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZTYXZvaWUxETAPBgNVBAcM
6+
AQkBFhBjYUBvcGVuLW9jcHAub3JnMB4XDTIyMDEyODIyMTAwOVoXDTMyMDEyNjIy
7+
MTAwOVowgagxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZTYXZvaWUxETAPBgNVBAcM
88
CENoYW1iZXJ5MRIwEAYDVQQKDAlPcGVuIE9DUFAxETAPBgNVBAsMCEV4YW1wbGVz
99
MSEwHwYDVQQDDBhPcGVuIE9DUFAgQ2VudHJhbCBTeXN0ZW0xKzApBgkqhkiG9w0B
1010
CQEWHGNlbnRyYWwuc3lzdGVtQG9wZW4tb2NwcC5vcmcwWTATBgcqhkjOPQIBBggq
11-
hkjOPQMBBwNCAAR677GKDxt/gxd7ijqSvhF61+ETcNAvleHheWYuMiDQdfkVazz/
12-
pEBvvyRDiYpL39GyLubcW0cFJY41inripW44ozEwLzAJBgNVHRMEAjAAMCIGA1Ud
13-
EQQbMBmCCWxvY2FsaG9zdIIMSVA6MTI3LjAuMC4xMAoGCCqGSM49BAMCA0gAMEUC
14-
IH2UJPDnxHhg6nT/GnW+qIDvas7BSAZMIRQQpzYpxINaAiEA1Xe79Q7BUJ98esNN
15-
NhtHEYmVcY4Pjzdb6r75m/vjJN4=
11+
hkjOPQMBBwNCAASQh65x/PvhYJJneJ4+SvRs8UFU86LvZatCsquGNbKFOPun8cRP
12+
VO/4kFRvQ5ePBCAjzKoPQD7n+U5ROZCWoDTuoykwJzAJBgNVHRMEAjAAMBoGA1Ud
13+
EQQTMBGCCWxvY2FsaG9zdIcEfwAAATAKBggqhkjOPQQDAgNIADBFAiEAiSPkDrFg
14+
ktbdMtzzi6AQgwbcQYDkmMmZKVoXjLqysrkCIBAfo0Iaj5/ZLGFKpaU7vvhR1CNb
15+
eavbFo36TILEfKYe
1616
-----END CERTIFICATE-----
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-----BEGIN EC PRIVATE KEY-----
2-
MHcCAQEEIFzxXv+7UwwnKeLgp8IB01r+fs5qAXiqjo8Ji/QJyCMjoAoGCCqGSM49
3-
AwEHoUQDQgAEeu+xig8bf4MXe4o6kr4RetfhE3DQL5Xh4XlmLjIg0HX5FWs8/6RA
4-
b78kQ4mKS9/Rsi7m3FtHBSWONYp64qVuOA==
2+
MHcCAQEEIBgb3p8yNSp0jonK6hQ/34jx8uVHVZJ6DkeiftklrDYxoAoGCCqGSM49
3+
AwEHoUQDQgAEkIeucfz74WCSZ3iePkr0bPFBVPOi72WrQrKrhjWyhTj7p/HET1Tv
4+
+JBUb0OXjwQgI8yqD0A+5/lOUTmQlqA07g==
55
-----END EC PRIVATE KEY-----

0 commit comments

Comments
 (0)