From 98bc9c336b7178d452529a757796050a5925bc1c Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty Date: Tue, 20 Sep 2022 21:50:05 +0530 Subject: [PATCH 1/6] SSL in JPA App --- .../mysql-server/createuser_query.sql | 2 + .../mysql-server/docker-compose.yml | 24 +++++++ .../mysql-server/generatecerts.sh | 35 +++++++++ .../java/com/baeldung/boot/jpa/Employee.java | 59 +++++++++++++++ .../baeldung/boot/jpa/EmployeeController.java | 23 ++++++ .../baeldung/boot/jpa/EmployeeRepository.java | 10 +++ .../src/main/resources/application.yml | 33 +++++++-- .../boot/jpa/EmployeeControllerUnitTest.java | 72 +++++++++++++++++++ 8 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 persistence-modules/spring-boot-mysql/mysql-server/createuser_query.sql create mode 100644 persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml create mode 100644 persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh create mode 100644 persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java create mode 100644 persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java create mode 100644 persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeRepository.java create mode 100644 persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java diff --git a/persistence-modules/spring-boot-mysql/mysql-server/createuser_query.sql b/persistence-modules/spring-boot-mysql/mysql-server/createuser_query.sql new file mode 100644 index 0000000000..b7e170eb85 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/mysql-server/createuser_query.sql @@ -0,0 +1,2 @@ +CREATE USER 'test_user'@'%' IDENTIFIED BY 'Password2022' require X509; +GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'%'; \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml new file mode 100644 index 0000000000..5c10ed29dd --- /dev/null +++ b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml @@ -0,0 +1,24 @@ +version: '3.8' + +services: + mysql-service: + image: "mysql/mysql-server:8.0.30" + container_name: mysql-db + command: [ "mysqld", + "--require_secure_transport=ON", + "--ssl-ca=/etc/certs/root-ca.pem", + "--ssl-cert=/etc/certs/server-cert.pem", + "--ssl-key=/etc/certs/server-key.pem", + "--default_authentication_plugin=mysql_native_password", + "--general_log=ON" ] + ports: + - "3306:3306" + volumes: + - type: bind + source: ./certs + target: /etc/certs/ + restart: always + environment: + MYSQL_ROOT_HOST: "%" + MYSQL_ROOT_PASSWORD: "Password2022" + MYSQL_DATABASE: test_db \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh b/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh new file mode 100644 index 0000000000..c4eb3e70cf --- /dev/null +++ b/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh @@ -0,0 +1,35 @@ +mkdir certs +cd ./certs + +# Generate new CA certificate ca.pem file. +openssl genrsa 2048 > root-ca-key.pem + +openssl req -new -x509 -nodes -days 3600 \ + -subj "/C=SE/ST=STOCKHOLM/L=Test/CN=fake-CA" \ + -key root-ca-key.pem -out root-ca.pem + +# Create the server-side certificates +openssl req -newkey rsa:2048 -days 3600 -nodes \ + -subj "/C=SE/ST=STOCKHOLM/L=Test/CN=localhost" \ + -keyout server-key.pem -out server-req.pem +openssl rsa -in server-key.pem -out server-key.pem +openssl x509 -req -in server-req.pem -days 3600 \ + -CA root-ca.pem -CAkey root-ca-key.pem -set_serial 01 -out server-cert.pem + +# Create the client-side certificates +openssl req -newkey rsa:2048 -days 3600 -nodes \ + -subj "/C=SE/ST=STOCKHOLM/L=Test/CN=localhost" \ + -keyout client-key.pem -out client-req.pem +openssl rsa -in client-key.pem -out client-key.pem +openssl x509 -req -in client-req.pem -days 3600 \ + -CA root-ca.pem -CAkey root-ca-key.pem -set_serial 01 -out client-cert.pem + +# Verify the certificates are correct +openssl verify -CAfile root-ca.pem server-cert.pem client-cert.pem + +# Convert pem to jks file +keytool -importcert -alias MySQLCACert.jks -file root-ca.pem \ + -keystore truststore.jks -storepass mypassword + +openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out certificate.p12 -name "certificate" +keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore cert.jks \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java new file mode 100644 index 0000000000..28869d0ac1 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java @@ -0,0 +1,59 @@ +package com.baeldung.boot.jpa; + + +import javax.persistence.*; +import java.io.Serializable; +import java.time.LocalDate; +import java.util.Date; + +@Entity +public class Employee implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Integer id; + + @Column(name = "emp_name") + private String empName; + + @Column(name = "job_title") + private String jobTitle; + + @Column(name = "emp_doj") + private LocalDate empDoj; + + @Column(name = "created_date") + private Date createdDate = new Date(); + + public Integer getId() { + return id; + } + + public String getEmpName() { + return empName; + } + + public void setEmpName(String empName) { + this.empName = empName; + } + + public String getJobTitle() { + return jobTitle; + } + + public void setJobTitle(String jobTitle) { + this.jobTitle = jobTitle; + } + + public LocalDate getEmpDoj() { + return empDoj; + } + + public void setEmpDoj(LocalDate empDoj) { + this.empDoj = empDoj; + } + + public Date getCreatedDate() { + return createdDate; + } +} diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java new file mode 100644 index 0000000000..8b6a233b45 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java @@ -0,0 +1,23 @@ +package com.baeldung.boot.jpa; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +public class EmployeeController { + + @Autowired + private EmployeeRepository empRepository; + + @GetMapping("/employee/{empId}") + public Employee get(@PathVariable(name = "empId") Integer empId) { + return empRepository.findById(empId).get(); + } + + @PostMapping("/employee") + public Employee createUser(@RequestBody Employee employee) { + System.out.println(employee); + empRepository.save(employee); + return employee; + } +} diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeRepository.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeRepository.java new file mode 100644 index 0000000000..38ace202d6 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.boot.jpa; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.io.Serializable; + +@Repository +public interface EmployeeRepository extends JpaRepository { +} diff --git a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml index f660ab4759..d7c559d92f 100644 --- a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml +++ b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml @@ -1,9 +1,8 @@ spring: - datasource: - url: jdbc:mysql://localhost:3306/test? - username: root - password: - + profiles: + active: "dev2" + main: + banner-mode: "off" jpa: hibernate: ddl-auto: update @@ -11,4 +10,26 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect jdbc: - time_zone: UTC \ No newline at end of file + time_zone: UTC +--- + +spring: + profiles: "dev1" + datasource: + url: jdbc:mysql://localhost:3306/test? + username: root + password: + +--- + +spring: + profiles: "dev2" + datasource: + url: >- + jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_IDENTITY& + trustCertificateKeyStoreUrl=file:/Users/saikatchakraborty/tutorials/persistence-modules/spring-boot-mysql/mysql-server/certs/truststore.jks& + trustCertificateKeyStorePassword=mypassword& + clientCertificateKeyStoreUrl=file:/Users/saikatchakraborty/tutorials/persistence-modules/spring-boot-mysql/mysql-server/certs/cert.jks& + clientCertificateKeyStorePassword=mypassword + username: test_user + password: Password2022 \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java new file mode 100644 index 0000000000..c15d77c6ca --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.boot.jpa; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import java.time.LocalDate; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WebMvcTest(EmployeeController.class) +public class EmployeeControllerUnitTest { + + @MockBean + private EmployeeRepository employeeRepository; + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Test + public void givenEmployeeId_whenGetEmployeeCalled_ThenReturnEmployee() throws Exception { + Employee employeeExpected = new Employee(); + employeeExpected.setEmpName("Test Emp"); + employeeExpected.setEmpDoj(LocalDate.now()); + employeeExpected.setJobTitle("Manager"); + + Mockito.when(employeeRepository.findById(1234)).thenReturn(Optional.of(employeeExpected)); + + MvcResult result = mockMvc.perform(get("/employee/1234")) + .andExpect(status().isOk()).andReturn(); + + Employee employee = objectMapper.readValue(result.getResponse().getContentAsString(), Employee.class); + assertEquals(employeeExpected.getEmpName(), employee.getEmpName()); + assertEquals(employeeExpected.getJobTitle(), employee.getJobTitle()); + assertEquals(employeeExpected.getEmpDoj(), employee.getEmpDoj()); + } + + @Test + public void givenEmployee_whenCreateEmployeeCalled_ThenReturnEmployee() throws Exception { + Employee employeeExpected = new Employee(); + employeeExpected.setEmpName("Test Emp"); + employeeExpected.setEmpDoj(LocalDate.now()); + employeeExpected.setJobTitle("Manager"); + + Mockito.when(employeeRepository.save(employeeExpected)).thenReturn(employeeExpected); + + MvcResult result = mockMvc.perform(post("/employee") + .content(objectMapper.writeValueAsString(employeeExpected)) + .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andReturn(); + + Employee employee = objectMapper.readValue(result.getResponse().getContentAsString(), Employee.class); + assertEquals(employeeExpected.getEmpName(), employee.getEmpName()); + assertEquals(employeeExpected.getJobTitle(), employee.getJobTitle()); + assertEquals(employeeExpected.getEmpDoj(), employee.getEmpDoj()); + } +} From 40013de660ae0b6855117a53a9a6c1d1ada1e865 Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty Date: Wed, 21 Sep 2022 22:53:50 +0530 Subject: [PATCH 2/6] Updated Employee --- .../spring-boot-mysql/mysql-server/generatecerts.sh | 2 +- .../main/java/com/baeldung/boot/jpa/EmployeeController.java | 6 +++++- .../spring-boot-mysql/src/main/resources/application.yml | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh b/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh index c4eb3e70cf..b43a95e6c7 100644 --- a/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh +++ b/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh @@ -32,4 +32,4 @@ keytool -importcert -alias MySQLCACert.jks -file root-ca.pem \ -keystore truststore.jks -storepass mypassword openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out certificate.p12 -name "certificate" -keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore cert.jks \ No newline at end of file +keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore client-cert.jks \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java index 8b6a233b45..663e28b82c 100644 --- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java @@ -2,6 +2,9 @@ package com.baeldung.boot.jpa; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.HttpClientErrorException; + +import java.util.Optional; @RestController public class EmployeeController { @@ -11,7 +14,8 @@ public class EmployeeController { @GetMapping("/employee/{empId}") public Employee get(@PathVariable(name = "empId") Integer empId) { - return empRepository.findById(empId).get(); + Optional emp = empRepository.findById(empId); + return emp.orElse(null); } @PostMapping("/employee") diff --git a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml index d7c559d92f..d70c21aad2 100644 --- a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml +++ b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml @@ -26,10 +26,10 @@ spring: profiles: "dev2" datasource: url: >- - jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_IDENTITY& + jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_CA& trustCertificateKeyStoreUrl=file:/Users/saikatchakraborty/tutorials/persistence-modules/spring-boot-mysql/mysql-server/certs/truststore.jks& trustCertificateKeyStorePassword=mypassword& - clientCertificateKeyStoreUrl=file:/Users/saikatchakraborty/tutorials/persistence-modules/spring-boot-mysql/mysql-server/certs/cert.jks& + clientCertificateKeyStoreUrl=file:/Users/saikatchakraborty/tutorials/persistence-modules/spring-boot-mysql/mysql-server/certs/client-cert.jks& clientCertificateKeyStorePassword=mypassword username: test_user password: Password2022 \ No newline at end of file From 0844dcd3b744d1a0399230f5609b47c3baac3384 Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty Date: Thu, 22 Sep 2022 09:55:21 +0530 Subject: [PATCH 3/6] Updated methods --- .../main/java/com/baeldung/boot/jpa/EmployeeController.java | 1 - .../com/baeldung/boot/jpa/EmployeeControllerUnitTest.java | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java index 663e28b82c..ac394476d5 100644 --- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java @@ -20,7 +20,6 @@ public class EmployeeController { @PostMapping("/employee") public Employee createUser(@RequestBody Employee employee) { - System.out.println(employee); empRepository.save(employee); return employee; } diff --git a/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java index c15d77c6ca..fe20fa87d3 100644 --- a/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java +++ b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java @@ -43,7 +43,7 @@ public class EmployeeControllerUnitTest { Mockito.when(employeeRepository.findById(1234)).thenReturn(Optional.of(employeeExpected)); MvcResult result = mockMvc.perform(get("/employee/1234")) - .andExpect(status().isOk()).andReturn(); + .andExpect(status().isOk()).andReturn(); Employee employee = objectMapper.readValue(result.getResponse().getContentAsString(), Employee.class); assertEquals(employeeExpected.getEmpName(), employee.getEmpName()); @@ -61,8 +61,8 @@ public class EmployeeControllerUnitTest { Mockito.when(employeeRepository.save(employeeExpected)).thenReturn(employeeExpected); MvcResult result = mockMvc.perform(post("/employee") - .content(objectMapper.writeValueAsString(employeeExpected)) - .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andReturn(); + .content(objectMapper.writeValueAsString(employeeExpected)) + .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andReturn(); Employee employee = objectMapper.readValue(result.getResponse().getContentAsString(), Employee.class); assertEquals(employeeExpected.getEmpName(), employee.getEmpName()); From 87c5981736ccb928142fd1292cda9747b9f20310 Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty Date: Sat, 24 Sep 2022 10:01:44 +0530 Subject: [PATCH 4/6] static import for mockito --- .../com/baeldung/boot/jpa/EmployeeControllerUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java index fe20fa87d3..812e6a6b29 100644 --- a/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java +++ b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java @@ -3,7 +3,6 @@ package com.baeldung.boot.jpa; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -16,6 +15,7 @@ import java.time.LocalDate; import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -40,7 +40,7 @@ public class EmployeeControllerUnitTest { employeeExpected.setEmpDoj(LocalDate.now()); employeeExpected.setJobTitle("Manager"); - Mockito.when(employeeRepository.findById(1234)).thenReturn(Optional.of(employeeExpected)); + when(employeeRepository.findById(1234)).thenReturn(Optional.of(employeeExpected)); MvcResult result = mockMvc.perform(get("/employee/1234")) .andExpect(status().isOk()).andReturn(); @@ -58,7 +58,7 @@ public class EmployeeControllerUnitTest { employeeExpected.setEmpDoj(LocalDate.now()); employeeExpected.setJobTitle("Manager"); - Mockito.when(employeeRepository.save(employeeExpected)).thenReturn(employeeExpected); + when(employeeRepository.save(employeeExpected)).thenReturn(employeeExpected); MvcResult result = mockMvc.perform(post("/employee") .content(objectMapper.writeValueAsString(employeeExpected)) From 55639b0add864d8f5e9c03d43d3ec452a9f4562b Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty Date: Thu, 6 Oct 2022 19:18:39 +0530 Subject: [PATCH 5/6] Updated configs --- .../mysql-server/convertcerts.sh | 7 ++++ .../mysql-server/docker-compose.yml | 9 ++--- .../mysql-server/generatecerts.sh | 35 ------------------- persistence-modules/spring-boot-mysql/pom.xml | 17 +++++++++ .../spring-boot-mysql/start_app.sh | 13 +++++++ 5 files changed, 40 insertions(+), 41 deletions(-) create mode 100644 persistence-modules/spring-boot-mysql/mysql-server/convertcerts.sh delete mode 100644 persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh create mode 100644 persistence-modules/spring-boot-mysql/start_app.sh diff --git a/persistence-modules/spring-boot-mysql/mysql-server/convertcerts.sh b/persistence-modules/spring-boot-mysql/mysql-server/convertcerts.sh new file mode 100644 index 0000000000..eb3700e578 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/mysql-server/convertcerts.sh @@ -0,0 +1,7 @@ +# Convert pem to jks file +mkdir certs + +keytool -importcert -alias MySQLCACert.jks -file ./data/ca.pem \ + -keystore ./certs/truststore.jks -storepass mypassword +openssl pkcs12 -export -in ./data/client-cert.pem -inkey ./data/client-key.pem -out ./certs/certificate.p12 -name "certificate" +keytool -importkeystore -srckeystore ./certs/certificate.p12 -srcstoretype pkcs12 -destkeystore ./certs/client-cert.jks \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml index 5c10ed29dd..8955cb2a2b 100644 --- a/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml +++ b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml @@ -6,17 +6,14 @@ services: container_name: mysql-db command: [ "mysqld", "--require_secure_transport=ON", - "--ssl-ca=/etc/certs/root-ca.pem", - "--ssl-cert=/etc/certs/server-cert.pem", - "--ssl-key=/etc/certs/server-key.pem", "--default_authentication_plugin=mysql_native_password", "--general_log=ON" ] ports: - "3306:3306" volumes: - - type: bind - source: ./certs - target: /etc/certs/ + - type: bind + source: ./data + target: /var/lib/mysql restart: always environment: MYSQL_ROOT_HOST: "%" diff --git a/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh b/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh deleted file mode 100644 index b43a95e6c7..0000000000 --- a/persistence-modules/spring-boot-mysql/mysql-server/generatecerts.sh +++ /dev/null @@ -1,35 +0,0 @@ -mkdir certs -cd ./certs - -# Generate new CA certificate ca.pem file. -openssl genrsa 2048 > root-ca-key.pem - -openssl req -new -x509 -nodes -days 3600 \ - -subj "/C=SE/ST=STOCKHOLM/L=Test/CN=fake-CA" \ - -key root-ca-key.pem -out root-ca.pem - -# Create the server-side certificates -openssl req -newkey rsa:2048 -days 3600 -nodes \ - -subj "/C=SE/ST=STOCKHOLM/L=Test/CN=localhost" \ - -keyout server-key.pem -out server-req.pem -openssl rsa -in server-key.pem -out server-key.pem -openssl x509 -req -in server-req.pem -days 3600 \ - -CA root-ca.pem -CAkey root-ca-key.pem -set_serial 01 -out server-cert.pem - -# Create the client-side certificates -openssl req -newkey rsa:2048 -days 3600 -nodes \ - -subj "/C=SE/ST=STOCKHOLM/L=Test/CN=localhost" \ - -keyout client-key.pem -out client-req.pem -openssl rsa -in client-key.pem -out client-key.pem -openssl x509 -req -in client-req.pem -days 3600 \ - -CA root-ca.pem -CAkey root-ca-key.pem -set_serial 01 -out client-cert.pem - -# Verify the certificates are correct -openssl verify -CAfile root-ca.pem server-cert.pem client-cert.pem - -# Convert pem to jks file -keytool -importcert -alias MySQLCACert.jks -file root-ca.pem \ - -keystore truststore.jks -storepass mypassword - -openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out certificate.p12 -name "certificate" -keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore client-cert.jks \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index 239378c7b1..6c8266e034 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -42,4 +42,21 @@ 8.0.23 + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.5.RELEASE + + + + repackage + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/start_app.sh b/persistence-modules/spring-boot-mysql/start_app.sh new file mode 100644 index 0000000000..2f126a9c88 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/start_app.sh @@ -0,0 +1,13 @@ +export TRUSTSTORE=./mysql-server/certs/truststore.jks +export TRUSTSTORE_PASSWORD=mypassword +export KEYSTORE=./mysql-server/certs/client-cert.jks +export KEYSTORE_PASSWORD=mypassword +export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_CA +export SPRING_DATASOURCE_USERNAME=test_user +export SPRING_DATASOURCE_PASSWORD=Password2022 + +java -Djavax.net.ssl.keyStore=$KEYSTORE \ + -Djavax.net.ssl.keyStorePassword=$KEYSTORE_PASSWORD \ + -Djavax.net.ssl.trustStore=$TRUSTSTORE \ + -Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD \ + -jar ./target/spring-boot-mysql-0.1.0.jar \ No newline at end of file From 3269737c6ce9b45ecb6a8eb7cc5b92a6aa1ab567 Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty Date: Mon, 17 Oct 2022 21:31:46 +0530 Subject: [PATCH 6/6] Updated docker compose yaml indentation --- .../mysql-server/docker-compose.yml | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml index 8955cb2a2b..ee5bc75bfb 100644 --- a/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml +++ b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml @@ -2,20 +2,20 @@ version: '3.8' services: mysql-service: - image: "mysql/mysql-server:8.0.30" - container_name: mysql-db - command: [ "mysqld", - "--require_secure_transport=ON", - "--default_authentication_plugin=mysql_native_password", - "--general_log=ON" ] - ports: - - "3306:3306" - volumes: - - type: bind - source: ./data - target: /var/lib/mysql - restart: always - environment: - MYSQL_ROOT_HOST: "%" - MYSQL_ROOT_PASSWORD: "Password2022" - MYSQL_DATABASE: test_db \ No newline at end of file + image: "mysql/mysql-server:8.0.30" + container_name: mysql-db + command: [ "mysqld", + "--require_secure_transport=ON", + "--default_authentication_plugin=mysql_native_password", + "--general_log=ON" ] + ports: + - "3306:3306" + volumes: + - type: bind + source: ./data + target: /var/lib/mysql + restart: always + environment: + MYSQL_ROOT_HOST: "%" + MYSQL_ROOT_PASSWORD: "Password2022" + MYSQL_DATABASE: test_db \ No newline at end of file