diff --git a/spring-security-x509/keystore/Makefile b/spring-security-x509/keystore/Makefile
new file mode 100644
index 0000000000..62f2e1395e
--- /dev/null
+++ b/spring-security-x509/keystore/Makefile
@@ -0,0 +1,76 @@
+PASSWORD=changeit
+KEYSTORE=keystore.jks
+HOSTNAME=localhost
+# CN = Common Name
+# OU = Organization Unit
+# O = Organization Name
+# L = Locality Name
+# ST = State Name
+# C = Country (2-letter Country Code)
+# E = Email
+DNAME_CA='CN=Baeldung CA,OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC'
+# For server certificates, the Common Name (CN) must be the hostname
+DNAME_HOST='CN=$(HOSTNAME),OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC'
+TRUSTSTORE=truststore.jks
+CLIENTNAME=cid
+
+all: clean create-keystore add-host create-truststore add-client
+
+create-keystore:
+ # Generate a certificate authority (CA)
+ keytool -genkey -alias ca \
+ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \
+ -validity 3650 -dname $(DNAME_CA) \
+ -keystore $(KEYSTORE) -storepass $(PASSWORD)
+
+add-host:
+ # Generate a host certificate
+ keytool -genkey -alias $(HOSTNAME) \
+ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \
+ -validity 3650 -dname $(DNAME_HOST) \
+ -keystore $(KEYSTORE) -storepass $(PASSWORD)
+ # Generate a host certificate signing request
+ keytool -certreq -alias $(HOSTNAME) \
+ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \
+ -validity 3650 -file "$(HOSTNAME).csr" \
+ -keystore $(KEYSTORE) -storepass $(PASSWORD)
+ # Generate signed certificate with the certificate authority
+ keytool -gencert -alias ca \
+ -validity 3650 -sigalg SHA512withRSA \
+ -infile "$(HOSTNAME).csr" -outfile "$(HOSTNAME).crt" -rfc \
+ -keystore $(KEYSTORE) -storepass $(PASSWORD)
+ # Import signed certificate into the keystore
+ keytool -import -trustcacerts -alias $(HOSTNAME) \
+ -file "$(HOSTNAME).crt" \
+ -keystore $(KEYSTORE) -storepass $(PASSWORD)
+
+create-truststore:
+ # Export certificate authority into truststore
+ keytool -export -alias ca -file ca.crt \
+ -keystore $(KEYSTORE) -storepass $(PASSWORD)
+ keytool -import -trustcacerts -noprompt -alias ca -file ca.crt \
+ -keystore $(TRUSTSTORE) -storepass $(PASSWORD)
+
+add-client:
+ # Generate client certificate
+ keytool -genkey -alias $(CLIENTNAME) \
+ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \
+ -validity 3650 -dname $(DNAME_HOST) \
+ -keystore $(TRUSTSTORE) -storepass $(PASSWORD)
+ # Generate a host certificate signing request
+ keytool -certreq -alias $(CLIENTNAME) \
+ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \
+ -validity 3650 -file "$(CLIENTNAME).csr" \
+ -keystore $(TRUSTSTORE) -storepass $(PASSWORD)
+ # Generate signed certificate with the certificate authority
+ keytool -gencert -alias ca \
+ -validity 3650 -sigalg SHA512withRSA \
+ -infile "$(CLIENTNAME).csr" -outfile "$(CLIENTNAME).crt" -rfc \
+ -keystore $(KEYSTORE) -storepass $(PASSWORD)
+ # Import signed certificate into the truststore
+ keytool -import -trustcacerts -alias $(CLIENTNAME) \
+ -file "$(CLIENTNAME).crt" \
+ -keystore $(TRUSTSTORE) -storepass $(PASSWORD)
+
+clean:
+ rm -f $(KEYSTORE) *.csr *.crt $(TRUSTSTORE)
diff --git a/spring-security-x509/server/pom.xml b/spring-security-x509/server/pom.xml
new file mode 100644
index 0000000000..eabd0364ef
--- /dev/null
+++ b/spring-security-x509/server/pom.xml
@@ -0,0 +1,58 @@
+
+
+ 4.0.0
+
+ com.baeldung.spring.security
+ server
+ 0.0.1-SNAPSHOT
+ jar
+
+ server
+ Spring x.509 Authentication Demo
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.4.0.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/UserResource.java b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/UserResource.java
new file mode 100644
index 0000000000..90c8897d8f
--- /dev/null
+++ b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/UserResource.java
@@ -0,0 +1,20 @@
+package com.baeldung.spring.security.x509;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.security.Principal;
+
+@Controller
+public class UserResource {
+
+ @RequestMapping(value = "/user")
+ public String user(Model model, Principal principal) {
+ UserDetails currentUser = (UserDetails) ((Authentication) principal).getPrincipal();
+ model.addAttribute("username", currentUser.getUsername());
+ return "user";
+ }
+}
diff --git a/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java
new file mode 100644
index 0000000000..ab7719df0f
--- /dev/null
+++ b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.security.x509;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class X509AuthenticationServer {
+
+ public static void main(String[] args) {
+ SpringApplication.run(X509AuthenticationServer.class, args);
+ }
+}
diff --git a/spring-security-x509/server/src/main/resources/application.properties b/spring-security-x509/server/src/main/resources/application.properties
new file mode 100644
index 0000000000..89a234b1ac
--- /dev/null
+++ b/spring-security-x509/server/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+server.ssl.key-store=../keystore/keystore.jks
+server.ssl.key-store-password=${PASSWORD}
+server.ssl.key-alias=localhost
+server.ssl.key-password=${PASSWORD}
+server.ssl.enabled=true
+server.port=8443
+security.user.name=Admin
+security.user.password=admin
\ No newline at end of file
diff --git a/spring-security-x509/server/src/main/resources/templates/user.html b/spring-security-x509/server/src/main/resources/templates/user.html
new file mode 100644
index 0000000000..0be84680fe
--- /dev/null
+++ b/spring-security-x509/server/src/main/resources/templates/user.html
@@ -0,0 +1,9 @@
+
+
+
+ X.509 Authentication Demo
+
+
+Hello !
+
+
\ No newline at end of file
diff --git a/spring-security-x509/server/src/test/java/com/baeldung/spring/security/x509/X509AuthenticationServerTests.java b/spring-security-x509/server/src/test/java/com/baeldung/spring/security/x509/X509AuthenticationServerTests.java
new file mode 100644
index 0000000000..f08916c80b
--- /dev/null
+++ b/spring-security-x509/server/src/test/java/com/baeldung/spring/security/x509/X509AuthenticationServerTests.java
@@ -0,0 +1,16 @@
+package com.baeldung.spring.security.x509;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class X509AuthenticationServerTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}