#!/bin/bash

########################### generator.sh ################################

echo "Generating TLS files..."
rm -f *.pem

# CA 인증기관의 private key 와 self-signed certificate(자체 서명 인증서)를 생성한다.
# -x509 :
# -newkey : Key 생성 방식
# -node : CA인증 개인키를 암호화 수행을 하지 않는다.
# -days : 인증서 유효기간을 설정한다.
# -keyout : 개인 키를 입력한 파일명으로 출력한다.
# -out : cert파일을 입력한 파일명으로 출력한다.
# -subj : 입력하지 않으면 CSR 생성 시 사용자 정보를 입력해야 된다.
#   - C : 나라이름
#   - ST : 지역이름
#   - L : 도시이름
#   - O : 기관
#   - OU : 기관이름
#   - CN : Common Name

echo "Generating CA private key..."
openssl req -x509 -newkey rsa:4096 -nodes -days 3650 -keyout ca-key.pem -out ca-cert.pem -subj "/C=KR/ST=ASIA/L=SEOUL/O=EXEM/OU=CLOUD/CN=EXEM"

# CA Cert파일 결과를 출력합니다.
# echo "CA's self-signed certificate"
# openssl x509 -in ca-cert.pem -noout -text

# 서버의 개인키와 CSR를 생성합니다.
# -node : 개인키 암호화를 수행하지 않는다.
echo "Generating server private key..."
openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem -subj "/C=KR/ST=ASIA/L=SEOUL/O=EXEM/OU=CLOUD/CN=DATAGATE"


# Kubernetes의 환경에서는 Kubernetes의 Service명으로 DNS 등록이 가능하다.
# 만약 IP를 이용하여 subjectAltName을 등록할때는 IP:0.0.0.0 으로 등록하면 된다.
#cat > ext.conf <<-EOF
#subjectAltName = @alt_names
#[alt_names]
#DNS.1=sam-datagate
#DNS.2=sam-datagate-develop
#DNS.3=sam-datagate-cloud-1675
#DNS.4=10.10.34.129
#EOF

cat > ext.conf <<-EOF
subjectAltName=DNS:dgate.dev.kr.datasaker.io
EOF

# 서버 인증서 요청에 서명합니다. (CSR)
echo "Generating server certificate..."
openssl x509 -req -in server-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile ext.conf

# Server Cert파일 결과를 출력합니다.
# echo "Server's signed certificate"
# openssl x509 -in server-cert.pem -noout -text

# CA, Server 인증서 확인
echo "Verifying certificate"
openssl verify -CAfile ca-cert.pem server-cert.pem

# Client의 개인키와 인증서 서명 요청(CSR)를 생성합니다.
echo "Generating client private key..."
openssl req -newkey rsa:4096 -nodes -keyout client-key.pem -out client-req.pem -subj "/C=KR/ST=ASIA/L=SEOUL/O=EXEM/OU=CLOUD/CN=TEST-AGENT"

# Client 인증서 요청에 서명합니다. (CSR)
echo "Generating client certificate..."
openssl x509 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile ext.conf

# Client 인증서 서명 결과 출력
# echo "Client's signed certificate"
# openssl x509 -in client-cert.pem -noout -text

NAMESPACE="dsk-middle"
VAULT_NAME="vault-0"

CA_CERT_NAME="ca-cert.pem"
CLIENT_CERT_NAME="client-cert.pem"
CLIENT_KEY_NAME="client-key.pem"
kubectl exec -it -n "$NAMESPACE" "$VAULT_NAME" -- \
vault kv put -mount=tls client \
ca_cert=$(openssl base64 -A -in "$CA_CERT_NAME") \
cert=$(openssl base64 -A -in "$CLIENT_CERT_NAME") \
key=$(openssl base64 -A -in "$CLIENT_KEY_NAME")


SERVER_CERT_NAME="server-cert.pem"
SERVER_KEY_NAME="server-key.pem"
kubectl exec -it -n "$NAMESPACE" "$VAULT_NAME" -- \
vault kv put -mount=tls server \
ca_cert=$(openssl base64 -A -in "$CA_CERT_NAME") \
cert=$(openssl base64 -A -in "$SERVER_CERT_NAME") \
key=$(openssl base64 -A -in "$SERVER_KEY_NAME")
