반응형

올해 초부터 시작했던 Google Cloud Study 가 어느덧 3번째 과정이 끝났다. 


2018/05/15 - [Development/Tech&Seminar] - Google Cloud Study Jams 후기


맨 처음에는 Qwiklabs 을 통해서 공부를 했었다. 그리고 두번 째 Advanced 과정에서는 Coursera 에 있는 GCP 과정을 수강을 했다. 

Qwiklabs 이나 Coursera 과정에 분명 실습 과정이 있긴 했지만 실습이 끝난 후에는 기억이 나지 않았다. ^^;;; 그래서 아쉬움이 많이 남긴 했었는데 이번에는 정말 사용해야 할 만한 이유가 생겼다.


바로 3번째 과정이 Cloud Hackathon 이라는 이름으로 프로그램을 직접  GCP 에 올려서 진행을 해야 했기 때문이다. 


우선 처음에 한숨이 나왔다.. 주제는 Bigdata 와 Kubernetes를 이용한 Microservice 구현 이었다. 먼저 선택은 Kubernetes를 이용한 Microservice 를 구현하는것으로 정했지만.. 뭐부터 해야할지 막막했다. 


기간은 총 6주. 충분한 시간이긴 했지만 정말.. 아무것도 할 수가 없었다. 갑자기 회사일은 바뻐지고. 덕분에 체력은 바닥나고. 명절에는 당연히 못하고.


그래도 결론적으로 거의 극적으로 구현까지는 했다. 그래서 지난 10월 6일 모든 팀들이 모여서 만든것을 소개하는 시간이 있었다. 


우리 팀에서 제출 한 것은 간단한 회원 가입을 Microservice 로 나누어서 GCP 의  Kubernetes에 올려서 동작을 확인해보는 것이었다. 만들긴 했지만 완성도가 많이 떨어졌다. 중간중간 exception처리나 message queue도 넣으려고 했는데 못 넣었다. 언제나 그렇지만 시간이 좀더 있었다면이라는 생각을 많이 했다. (그런데.. 시간이 많이 있었으면 좀더 나았을까 라는 질문도 던져봤다. -_-;;;)


다른 팀들 발표도 계속 진행이 되었고 독특한 아이디어로 구현한 모습들이 많았다. 약간 부끄러웠다. ㅠㅠ



기념품으로 후드 짚업과 여행용 짐정리 가방(?) 을 받았다. 



그리고 이런 인증서도 받았다. 좀더 잘 할 걸 이라는 후회가 되었지만 아무튼 좀 뿌듯했다.



그리고 이번 3차 과정 수료로 또 하나 모은 배지. 드디어 3개를 모았다. 



총 4개를 모으면 하나의 모양을 만들어내는 배지이다. 이제 마지막 1개가 남았다. 




그리고 공개된 마지막 4단계 최종 과정. 5번째는 개인별로 직접 지원(?) 이기 때문에 일단 4단계에서 최종 마무리가 된다. 그리고 주어진 미션은 이번달 10월 25일에 열리는 Google Summit 에서 개발자 라운지(?) 라는 곳에서 이번에 발표한 내용을 그곳에서 발표하는 것이다. ㅡ,,ㅡ;;;;; 망했다..


25일에 열리는 Google Summit 은 참석을 하려고 신청은 미리 하긴 했었는데 이런 형태로 참석을 해야 될줄은 몰랐다. 앞으로 남은 기간은 2 주 정도. 지금 만들어놓은 것을 어떻게 해서든지 다듬어야 하는데 과연 그게 가능할 지 모르겠다. 지금껏 했는데 마지막 하나를 포기하자니 정말 아쉽고, 발표를 하자니 눈앞이 깜깜하다. 


이번 Hackathon 과정이 끝나면 뭐가 기다릴지 굉장히 궁금했는데 이런게 있을 줄이야. 한숨 돌릴 수 있을 줄 알았는데 더 바쁘게 생겼다. ㅠㅠ


728x90
반응형
반응형

로컬 또는 git에서 빌드한 파일을 AWS에 ubuntu 로 파일 옮기는게 귀찮아서 jenkins 로 받아서 가져올수 있도록 만들어봤다..

이곳에 가면 바로 설치할 수 있는 가이드가 있다.


https://jenkins.io/doc/book/installing/#on-macos-and-linux


docker run \

  -u root \

  --rm \

  -d \

  -p 49000:8080 \

  -v jenkins-data:/var/jenkins_home \

  -v /var/run/docker.sock:/var/run/docker.sock \

  jenkinsci/blueocean


각각 의 라인 별로 설명도 잘 되어있다. 나는 우선 host port를 8080으로 사용하기 싫어서 49000번으로 설정했다.


CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                NAMES

ac6489e4bc34        jenkinsci/blueocean   "/sbin/tini -- /usr/…"   3 seconds ago       Up 2 seconds        50000/tcp, 0.0.0.0:49000->8080/tcp   suspicious_benz

e99420ff2ee4        mysql                 "docker-entrypoint.s…"   24 hours ago        Up 24 hours         0.0.0.0:3306->3306/tcp, 33060/tcp    mysql-db



run 할때 이름을 따로 안줘서 이상한 이름이 들어가 있으니 이름을 바꿔보자.


docker rename suspicious_benz jenkins


ONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                NAMES

ac6489e4bc34        jenkinsci/blueocean   "/sbin/tini -- /usr/…"   10 minutes ago      Up 10 minutes       50000/tcp, 0.0.0.0:49000->8080/tcp   jenkins

e99420ff2ee4        mysql                 "docker-entrypoint.s…"   24 hours ago        Up 24 hours         0.0.0.0:3306->3306/tcp, 33060/tcp    mysql-db


이렇게 정상적으로 이름이 바뀌었다.


Host Url 의 49000번 포트로 접속을 하면 Jenkins 가 기동된 모습이 나온다. 그런데 아직 정상적인 모습은 아니다.



Administrator password 를 넣으라는데 어디서 찾지?? 다음 명령어를 통해 jenkins container 안으로 들어간다.


 docker exec -it jenkins bash


container 로 접속 한 후에 저 캡쳐한 사진을 보면 경로가 나와있다. 


/var/jenkins_home/secrets/initialAdminPassword


이 파일 안에 password 가 있다. password 를 복사해서 붙여넣고 Continue를 누르면 된다.



난 첫번째꺼 선택하고 진행했다.

이것저것 설치되면서 진행이 된다.


admin 계정으로 생성할 정보를 넣은 후 Save and Continue를 누른다.



접속 URL 을 다시 안내해준다.



이렇게 해서 Jenkins 설치가 마무리 되었다.


728x90
반응형

'Development > Build' 카테고리의 다른 글

[Gradle] gradle build error tool.jar... valid JDK  (0) 2018.10.19
[Gradle]Ubuntu 에서 Gradle 설치하기  (0) 2018.10.19
Mac 에서 gradle 설치  (0) 2016.07.04
Maven 라이브러리 추출  (0) 2016.01.06
Maven clean, install, build??  (0) 2015.05.12
반응형

Docker 로 mysql 를 올려봤다. 


실행시키는 방법은 아주 간단하다.


docker run --name mysql-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<password> -d mysql


이렇게 하면 mysql container 가 구동된다.


docker container ps 


CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES

e99420ff2ee4        mysql               "docker-entrypoint.s…"   26 minutes ago      Up 6 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-db


여기까지는 쉬웠다. 

그런데 내 로컬 컴퓨터에서 저 DB 에 접속을 하려고 하니.. .접속이 안됐다. 참고로 저 위치는 AWS 에 있는 EC2 에 ubuntu를 올려서 설치한 것이다.


먼저 AWS 보안 그룹을 추가했다.


그래도 안된다.


그 다음에 mysql 설정을 찾아봤다.


docker exec -it mysql-db bash


이렇게 하면 container 안으로 들어올 수 있다.  container에 들어와서 mysql -u root -p 를 이용해서 mysql 로 접속한다.


mysql> select host from mysql.user where user='root';

+-----------+

| host      |

+-----------+

| %         |

| localhost |

+-----------+

2 rows in set (0.00 sec)


저렇게 쿼리를 했을 때 %가 포함되어있으면 root 계정에 한해서 모든 접속을 허용한다고 한다.... 그런데 안되네?????


계속 해서 에러가 난다.


Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found


이 에러는 mysql 의 password 방식이 변경되서 나는 에러라고 한다. 

그래서 다시 검색!!!! 그러던 중 아래와 같은 글을 발견했다.


https://stackoverflow.com/questions/49194719/authentication-plugin-caching-sha2-password-cannot-be-loaded


먼저 /etc/mysql/my.cnf 파일에 아래와 같은 설정을 추가한다. 


[mysqld]

default_authentication_plugin=mysql_native_password


그래도 안된다...


ALTER USER 'username'@'ip_address' IDENTIFIED WITH mysql_native_password BY 'password';


나같은 경우는


ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '<password>';


이렇게 실행을 했더니 드디어 접속이 됐다. 

하아... 정말 길고 긴 여정이었다. 

docker로 mysql 은 설치 했는데 접속을 할줄 몰라서 고생하고, 어떻게 접속을 해야 하는지 몰라서 찾아보고...

접속을 했는데 편집기가 설치가 안되어 있어서 vim 도 다시 설치하고...

정말 알아야 할게 너무 많구나.

그런데.. 내가 원래 하려던 것은 이게 아니었는데 DB 를 준비하려고 하다 보니 이런 삽질을 했다...ㅠㅠ


728x90
반응형
반응형

우분투 기준으로 postgresql 사용시 session 확인 및 종료 시키는 방법이다.

pgAdmin 에서는 할수 없는것인지.. 내가 못찾은것인지는 아직 모르겠다.  


우선 우분투에서 postgres 에 접속을 한다. 


$ sudo -u postgres psql


그리고 나서 아래와 같이 쿼리를 실행시킨다. 


$ select * from pg_stat_activity where datname=<DATABASE 명>;


이렇게 실행을 시키면 아래와 같이 결과 값이 나온다. 내가 아래에 붙여놓은것은 상단에 있는 컬럼 값만 넣은것이다. 실제로 프로세스가 있다면 아래에 쭉~~ 나오게 된다. 여기에서 볼것은 PID 이다. 


 datid | datname | pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | xact_start | query_start | state_change | waiting | state | query

-------+---------+-----+----------+---------+------------------+-------------+-----------------+-------------+---------------+------------+-------------+--------------+---------+-------+-------


위에서 확인한 PID를 보고 아래와 같이 쿼리를 실행한다. 


$ Select pg_terminate_backend(PID);


이렇게 실행을 시키면 프로세스가 종료된다. 


728x90
반응형
반응형

Docker 를 사용하려면 기본적으로 루트 권한이 필요하다. 그래서 그냥 쓰려면 매번 sudo 를 붙여 쓰던지 아니면 root 권한으로 변경해서 사용해야 한다.

root 로 변경해서 사용하기는 좀 그렇고 현재 사용중인 사용자를 docker 그룹에 등록을 해주면 된다.



sudo usermod -aG docker [현재 사용자]


usermod : 사용자 속성을 변경하는 명령어

-G (--groups) : 새로운 그룹을 말한다.

-a(--append) : 다른 그룹에서 삭제 없이 G 옵션에 따른  그룹에 사용자를 추가한다.


그리고 나서 우분투를 재기동 해주면 sudo 없이 사용할 수 있다.


sudo systemctl reboot


또는


sudo -su - [현재사용자]


로 해주면 재기동 없이 사용할수 있다. 



혹시라도 다음과 같은 에러가 발생한다면..


Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied


/var/run/docker.sock 파일의 권한을 변경한다.

sudo chmod 666 /var/run/docker.sock


728x90
반응형
반응형

마이크로서비스를 구현(?) 하는 방법으로 TCC 라는 방법을 사용한 기사가 있어 내용을 소개하고자 한다. 

https://dzone.com/articles/transactions-for-the-rest-of-us

원문은 위에 dzone 사이트에 있다. 


TCC : Try-Confirm/Cancle


예약 시스템이 있다고 가정해보자. 예약은 다음과 같은 경우에 이루어진다. 

비행기와 자동차를 각각의 업체에서 예약을 한다. 바르셀로나로 가는 비행기를 예약을 하고 스페인 남부로 가기 위한 자동차를 예약 한다고 가정해보자. 

비행기 표가 없으면 차를 예약 할 필요가 없고 차가 없으면 비행기를 예약할 필요가 없다. 결론적으로 둘다 예약 가능 해야 예약을 한다. 


TCC에서 정의하는 기본적인 단계

1. 항공사에 HTTP POST 로 비행기를 예약 한다. 항공사는 확정을 하기 위한 URI와 expiration 을 준다. 

2. 렌터카 업체에 HTTP POST 로 자동차를 예약 한다. 마찬가지로 렌탈 업체는 확정을 하기 위한 URI 와 expiration 을 준다. 

3. 각각 받은 URI로 PUT 메소드로 호출을 한다.


Cancel 과 Confirm

항공사와 렌터카는 expiration 기간이 지난 후에는 자체적으로 취소하는게 가능하다. 이것은 위에서 정의한 3번을 실행하기 전에 이미 expiration 기간이 지났음을 의미한다. 

3번이 실행된 이후에 발생하는 각각의 오류에 대해서는 항공사나 렌터카 서로에게 영향을 주지 않는다. 이미 예약은 Confirmed 된 상태이기 때문이다. 


TCC Service / Participant

TCC participants (여기에서는 항공사와 렌터카) 는 "예약" 서비스를 위한 간단한 라이프 사이클 모델을 구현하기 위해 다음과 같은 상태를 따른다.

1. Initial : 아무것도 일어나지 않은 상태이다.

2. Reserved : HTTP POST를 통해서 "Try"를 한 상태이다. participants(항공사 또는 렌터카)는 Confirm 을 할 수 있는 URI와 만료시간을 제공한다. 

3. Final : 예약이 확정된 상태이며 쉽게 취소할수 없다. participants 가 지정된 시간 안에 HTTP PUT 메시지를 받으면 이 상태로 변경된다.

그림으로 표현하면 아래와 같다. 

Post 메소도를 통해서 받은 응답에는 PUT 으로 보낼수 있는 URI(ID 포함) 와 expiration 이 포함되어야 한다. 

보기에는 간단해 보이지만 실제로 구현하려면 중간중간 exception처리가 만만치 않아 보인다. 

각각을 Rest 로 호출을 하면서 각각의 서비스에서 발생한 Exception 에 대한 처리도 고민을 해봐야 하고 Response 에 대한 딜레이를 줄이기 위해 Message Queue 사용에 대한 부분도 확인을 해봐야 한다. 


728x90
반응형
반응형

1. RBAC Authorization


개개인의 Role  의해서 network resource  access 할수 있도록 허용한다.

RBAC  rbac.authorization.k8s.io API 그룹을 사용한다.

RBAC  사용하기 위해서는 apiserver start 시에 --authorization-mode=RBAC 또는 /etc/kubernetes/manifests/kube-apiserver.yaml 파일에 kube-apiserver 항목에 --authorization-mode=RBAC  설정해주면 된다.


2. Role & ClusterRole


- Role  단일한 namespace 있는 resource 에 대한 권한을 정의한다.

role.yaml

1
2
3
4
5
6
7
8
9
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
cs
apiGroups & resources : 어떤 Resource 대한 Rule 인지를 정의한다.

Verbs : 어떤 operation  할지 정의한다.


- Cluster Role  모든 namespace  대한 권한을 정의한다. 

clusterrole.yaml

1
2
3
4
5
6
7
8
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]
cs

Role 정의와 동일하지만 metadata  namespace 항목만 빠져있다.


3. RoleBinding & ClusterRoleBinding

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
RoleBinding
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: Group
  name: group1
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: group12
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io
cs


Binding을 통해서 각각의 group 에 role 과 clusterrole 을 바인딩을 했다. role 은 group1, clusterrole 은 group2 에 바인딩을 했다. 


이렇게 바인딩이 끝나면 Group 에 따라서 호출할 수 있는 API 가 달라지게 된다. 



728x90
반응형
반응형

현재 AWS  EC2 에 올라가 있는 ubuntu 에 kubernetes를 설치해 보았다. 

그런데 설치를 하다보니 프리티어로 받은 t2.micro 가지고는 너무 성능이 느렸다. 거의 접속도 못할 지경에 이르렀다. 그래서 어차피 설치하고 지울거니깐 t2.large로 올렸다.


설치 전에 Docker 가 먼저 설치 되어 있어야 한다.

(Docker 가 설치 안되어 있다면 https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository 여기 참고하거나 아래 링크 에도 내용은 나와있다.)


https://kubernetes.io/docs/setup/independent/install-kubeadm/


여기에 들어가보면 친절하게 설치 하는 방법을 찾을 수 있다.

내용을 살펴보면 Docker 설치도 포함하고 있어서 Docker 가 설치되어 있지 않다면 그대로 따라 하면 된다.


그리고 나는 Ubuntu 에 설치를 하니 아래와 같이 명령어를 실행 했다. 혹시 명령어 실행중 permission 에러가 나면 sudo 붙이고 실행 하면 된다.

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

이렇게 하면 kubelet, kubeadm, kubectl 이 설치가 된다.


https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/


그 다음 스텝으로 위 링크로 들어가서 클러스터를 생성 하면 된다.


여기 나와 있는 내용중에 보면 사양이 나와있다. 

  • One or more machines running a deb/rpm-compatible OS, for example Ubuntu or CentOS
  • 2 GB or more of RAM per machine. Any less leaves little room for your apps.
  • 2 CPUs or more on the master
  • Full network connectivity among all machines in the cluster. A public or private network is fine.

최소 사양이다. 이러니 t2.micro 로는 역부족이었다.

kubeadm init <args> 

이렇게 명령어를 날리면 뭔가 내용이 올라오면서 설치가 된다. args는 다양하게 있으나 나는 우선 필요가 없어서 안 넣었다. 설치가 완료되면 아래와 같은 내용들이 나온다. (ip랑 port, 토큰 부분은 ㅌㅌㅌ로 처리했다.)


Your Kubernetes master has initialized successfully!


To start using your cluster, you need to run the following as a regular user:


  mkdir -p $HOME/.kube

  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  sudo chown $(id -u):$(id -g) $HOME/.kube/config


You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

  https://kubernetes.io/docs/concepts/cluster-administration/addons/


You can now join any number of machines by running the following on each node

as root:


  kubeadm join <ip>:<port> --token ㅌㅌㅌㅌㅌㅌㅌㅌ --discovery-token-ca-cert-hash sha256:ㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌㅌ


잘 읽어보면 cluster 시작하려면 .kube에 config 파일을 만들라는 내용이 있다. 아주 편리하게 저 내용을 그대로 복사해서 붙여넣으면 된다. 그리고 아래 join에 나오는 내용은 잘 복사해서 저장해두자.


이렇게 하고 "kubectl get pods --all-namespaces" 라고 치면 아래와 비슷하게 나온다. 


NAMESPACE     NAME                                       READY     STATUS    RESTARTS   AGE

kube-system   coredns-78fcdf6894-86s7n                   0/1       Pending   0          7m

kube-system   coredns-78fcdf6894-ngk7x                   0/1       Pending   0          7m

kube-system   etcd-ip-172-31-22-134                      1/1       Running   0          7m

kube-system   kube-apiserver-ip-172-31-22-134            1/1       Running   0          7m

kube-system   kube-controller-manager-ip-172-31-22-134   1/1       Running   0          6m

kube-system   kube-proxy-46x54                           1/1       Running   0          7m

kube-system   kube-scheduler-ip-172-31-22-134            1/1       Running   0          6m


그리고 위에도 써있듯이 cluster에 network를 배포해야 한다. 

위 링크(https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network 또는 https://kubernetes.io/docs/concepts/cluster-administration/addons/) 따라가보면 종류별로 방법이 있다. 설치하고 나서 다음과 같이 확인 해보면 된다.


 kubectl get nodes

NAME               STATUS    ROLES     AGE       VERSION

ip-111-11-11-111   Ready     master    32m       v1.11.2


아직 node 를 추가 못해봤는데 다음에는 node 도 따로 추가해봐야겠다.


728x90
반응형
반응형

HTTPS를 위해서 인증서 발급을 위해 openssl 을 이용해봤다..

 

https://sourceforge.net/projects/openssl/

 

여기 가서 다운 받아서 압축을 풀면 일단 설치는 완료된다. (윈도우 기준)

 

1. Private KEY 생성

 

명령어 : oepnssl genrsa -out [파일명] 2048

 

# openssl genrsa -out private.key 2048

Generating RSA private key, 2048 bit long modulus

.................................................+++

.................+++

 

e is 65537 (0x10001)

 

private.key

 

-----BEGIN RSA PRIVATE KEY-----

MIIEpAIBAAKCAQEAzLTDf8Q50h4H+S7H8fGLOSxQa68YSN43SDdF4GEL7rEBTt26

n+sJ/MILYk/OoSoTW46jq5YebGzWO2mqw/lciy7hx3xmhMTLjUsSmihrUfQKKrFZ

PeTKVdk9VocnnM+PutWdojhByRhlbDuYGtMku7o3mGhOK7TecZAkg0XDCLJnxyK5

Sfcx7LL/ZxJZoDlQYUqODD48jA5Ao3NsiYgRnBSvPuo2EaNHAEl9Uk9b8KGh8KK7

X75ixAa/vwDFik4BXG6MDV3nerR6yFrhyV0jDWwhArFwfNVC4T376y8nKcl6dToW

njNLe37jqIw6np7CLCn0b7l3yAL9eSvJsnmWywIDAQABAoIBAQC4amzpUL0KZxWl

zhhBBer4Ac0dhetp0g+Zlnn0D1mxmnLkOurjINqpg6K/2cf79yzjQdh/P0l/Qnmp

oqM91AskNIMgtRiiqav7SVOj35/3f9Qc7BLKqLADsScKKc5s/aytk75kIyxY3wqX

/AQmvmsMWFG3kthBlbsEMehC/vkafgh9HKpjsZfQFr7O/yBQ2p9t4PyHWf0sPaqZ

/tKxb7jGij+Z9MhaGQc4Xn2nAHooHOOrrj1uPc6m26avalkMk0VzTg60kitTNa0H

lrKWlMSzEK8avE+Bus+PPcQmDBmyAdbAomOaOmmE7+9Bk7/ewfJ0HRlM5pj/8z01

TyhLrxbhAoGBAPyKcJVVIBGwBaB96UaLlzlgyh8zyrIucEsnaxJkJfrxZrn8ACww

XeTaVpSviCF1Sst8Km3f6Ncvla1Hfl2unVgTIunkbKrrzKWPrMxwiAvY6lB3/tGa

OsS8ohzhrpXKEKjDAc0tnnsNI1auWh210KpUGt4Whzk3rvEnmcEQKY+7AoGBAM+C

ljFld5xpcrJkb8r4G2nUbvUPRekqlVb2gSzff5/O12aQUF7YBDQmijDNNaA6I5eB

2McPfhOAPlE3ecQ0u2+g4CCaTorxNwzOsVfgfYZGqhqM9rG/GEhFztfcpUFwmX0L

AKjhZhqXjTxZBfz368jyR83oSb3PIkDOuOhMC/wxAoGAD4OJqwLRt4RytAtIG1dT

8OhrQkNyPkPwDg3b3ANe+e1+fAppEE3gVsC69ONbn4KPF7UG/jz1FtMLhNuRfbvO

WqzCRlAMBOv7ZGhRGzYGhYPL0Smt875fwdo8sz2B9h21rEhegfY9eB20gAyx6IVU

zkHgbKhBolgzXQkrvtp5UyUCgYEAlyCyJhOSA1ZA9G91g8sim/bdQJj4/5HF5ent

tjKoDklkUwwznH+SwDB5YIVz0tfE6CjnKkK8PZOezyOqCR2mjOwLj3MSVNrMjwVR

34Bdqxd395JGcLmOA8Tjmg7WREyvXIRQ3K4b4K4TbKohVFVzYYwig3HzkstyVOS5

gmUwLWECgYBE8CjpaFHvDiU3zpLXu6j3nn4OFrIj8CYwm6pyBTbWLy1hFz0aShZn

oXL9pLGsmNqWDwzk7PCoiqJLraGUnhycx6ylZIzlPssiezKL2S+QgN204fCwa34r

YRnr5og9+HyGukl3+d8zVxEd9NCL8Qh5hco0PjMn7aTVp+fhz6GT7g==

-----END RSA PRIVATE KEY-----

 

 

2. Public Key 생성

 

명령어 : openssl rsa -in [private key 파일명] -pubout -out [파일명]

 

# openssl rsa -in private.key -pubout -out public.key 

writing RSA key

 

public.key 

 

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzLTDf8Q50h4H+S7H8fGL

OSxQa68YSN43SDdF4GEL7rEBTt26n+sJ/MILYk/OoSoTW46jq5YebGzWO2mqw/lc

iy7hx3xmhMTLjUsSmihrUfQKKrFZPeTKVdk9VocnnM+PutWdojhByRhlbDuYGtMk

u7o3mGhOK7TecZAkg0XDCLJnxyK5Sfcx7LL/ZxJZoDlQYUqODD48jA5Ao3NsiYgR

nBSvPuo2EaNHAEl9Uk9b8KGh8KK7X75ixAa/vwDFik4BXG6MDV3nerR6yFrhyV0j

DWwhArFwfNVC4T376y8nKcl6dToWnjNLe37jqIw6np7CLCn0b7l3yAL9eSvJsnmW

ywIDAQAB

-----END PUBLIC KEY-----

 

 

3. CSR 생성 (Certificate Signing Request - 인증서 서명 요청)

 

- 인증서 발급을 위한 필요한 정보를 담고 있는 인증서 신청 형식 데이터 이다. 

 

 구분  작성 예 
 Country Name (국가코드)   KR
 State or Province Name (시/도의 전체이름)  Seoul
 Locality Name (시/군/구 등의 이름)  Songpa-gu 
 Organization (회사이름)  XXXX
 Organization Unit (부서명)  Server
 Common Name (SSL 인증서를 설치할 서버의 Full Domain)  www.xxxx.com

 

주의 사항

- Common Name 에는 인증서를 설치할 사이트의 도메인의 이름을 넣어야 한다. (ip, port, http, https 포함불가능)

 

명령어 : openssl req -new -key [private key 파일명] -out [파일명]

 

# openssl req -new -key private.key -out private.csr

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:KR

State or Province Name (full name) [Some-State]:Seoul

Locality Name (eg, city) []:Seoul

Organization Name (eg, company) [Internet Widgits Pty Ltd]:local

Organizational Unit Name (eg, section) []:local

Common Name (eg, YOUR name) []:local

Email Address []:test@test.com

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:test

An optional company name []:test

 

중간중간 뭐라고 나오는 내용들이 많이 있다. 일단 테스트 이기 때문에 대충 넣었다.

 

private.csr

 

-----BEGIN CERTIFICATE REQUEST-----

MIIC3jCCAcYCAQAwbzELMAkGA1UEBhMCS1IxDjAMBgNVBAgTBUtvcmVhMQ4wDAYD

VQQHEwVTZW91bDENMAsGA1UEChMEdGVzdDENMAsGA1UECxMEdGVzdDENMAsGA1UE

AxMEdGVzdDETMBEGCSqGSIb3DQEJARYEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD

ggEPADCCAQoCggEBAOAF/QjGmdafbFanuHg3MyUlABiBhPTavX1eGzqGD/oxLwMu

e8DHEAeLBQGwpIq8qqDd8hmjFUL7blt4bzAAaGTtRnK7y1kegFNE/qftv6Imx1x6

5V2Cnh/998a3O0NXCvkBu5RRKALVl1qHOl4PKFLeX+NyoGzhqInu8ZrWu86K0cRu

JqtRF9Qpd0r7/E3yGaFdPIVA0AtM8W8+ne9Y3mMHeC7Os6DvEH1H6ZwReQljDZKK

lPjqBZwN4pn2W9ws3U0N6iTn37gQDTCJFW3MwIFUk+wK4L95XfZXCx+x/L5khTkV

mVUFvSbEw6FYWK0xeQKKtol6qUOkqC+EvKggPkUCAwEAAaAqMBMGCSqGSIb3DQEJ

AjEGEwR0ZXN0MBMGCSqGSIb3DQEJBzEGEwR0ZXN0MA0GCSqGSIb3DQEBCwUAA4IB

AQCHP6rPvZWJx1w6MW+Te3WWlaGo6WCHaVv6nxYgvnCgX+BK2B2FY9MfaSagZabj

x4SVxctJlO8WfWz+vI+iOONxkDgfPXerIXSm6qDF2ITcYvWeU/6N12Ixf+mapygO

6dTfpqAsHePJmHgWah9s+uzYllYT+HlVJtSwooKOhsYER/oEttCbDc1NGnJVLO2S

cbpbVbuuqo12MtdrZ/ZrSPiHKU+gJzieUd8gUXVDEXbo6ljlRkONMe1LPPmeKvGy

6nfaE78/U0rBce1qPaxlPUVl16bHfnjjC5BTFjym0jcMnKbOuHiHVCAeuscTXoiF

YaRIlbEUh+D/5QhtMMKqJV0o

-----END CERTIFICATE REQUEST-----

 

 

4. CRT 인증서 만들기

 

명령어 : openssl req -x509 -days [기간] -key [private key 파일명] -in [csr 파일명] -out [파일명] -days [기간]

 

# openssl req -x509 -days 365 -key private.key -in private.csr -out mycommoncrt.crt -days 365

You are about to be asked to enter information that will be incorporated                     

into your certificate request.                                                               

What you are about to enter is what is called a Distinguished Name or a DN.                  

There are quite a few fields but you can leave some blank                                    

For some fields there will be a default value,                                               

If you enter '.', the field will be left blank.                                              

-----                                                                                        

Country Name (2 letter code) [AU]:KR                                                         

State or Province Name (full name) [Some-State]:Seoul                                        

Locality Name (eg, city) []:Songpa-gu                                                        

Organization Name (eg, company) [Internet Widgits Pty Ltd]:                                  

Organizational Unit Name (eg, section) []:                                                   

Common Name (eg, YOUR name) []:                                                              

Email Address []:                                                                            

 

mycommoncrt.crt

 

-----BEGIN CERTIFICATE-----

MIID4zCCAsugAwIBAgIJAJ73VwJ+KNz9MA0GCSqGSIb3DQEBCwUAMFQxCzAJBgNV

BAYTAktSMQ4wDAYDVQQIEwVTZW91bDESMBAGA1UEBxMJU29uZ3BhLWd1MSEwHwYD

VQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTgwODIzMDEwMzE3WhcN

MTkwODIzMDEwMzE3WjBUMQswCQYDVQQGEwJLUjEOMAwGA1UECBMFU2VvdWwxEjAQ

BgNVBAcTCVNvbmdwYS1ndTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkg

THRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzKib3QSYnn5bGtIY

2DOQiPpieNNzpiyE8+Uhf9VufyBeMR8DGfaCuku0cjqF15Gqkgl2+3DavaGtyuNQ

e8Idz1jUHW/nLUlKLOzYf/a3W4n7EOjzhUv3H16KenqxhJcc1RFs6Zg+c/n76hId

/NrFbLq/kX4/xEPmRRe6O88SSUlcyBVQo59jMNH0IJOHZ8V1gKvTpQkUt3su7ojX

QfkmQv2Hps6pg2FRPnysDS6wDolaMt1f/Dd51l/Y29Dm5sjiPTHXZbYp/mD0Ka3T

TipnM60wMdDSdCQx9aT0hdVhXEHz0aSMezJP5SUvbIL4DHQPC1GHF2vYlsbivp/t

6Uu4kQIDAQABo4G3MIG0MB0GA1UdDgQWBBRRJxq/mdmqJswbHi1djbMaGnmQhzCB

hAYDVR0jBH0we4AUUScav5nZqibMGx4tXY2zGhp5kIehWKRWMFQxCzAJBgNVBAYT

AktSMQ4wDAYDVQQIEwVTZW91bDESMBAGA1UEBxMJU29uZ3BhLWd1MSEwHwYDVQQK

ExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGSCCQCe91cCfijc/TAMBgNVHRMEBTAD

AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQADDWN84F8IdPmc43jGi2jOmhp3OwHoBvVp

DXJrXJNGjDYpJ8BZn+kf6K5D59qZfIW1cHhzaf/kylQsHF2cH8ZFU69kp0txIi/f

9hOu5W/OwxtyCmomaL99zJdHePfj4MFhu+aANCkaOcEFlE3kc+JTCdj2jPZxMIJr

dIBsbLJeEwX8q7RJ2t/pPn/LiYRVuEEj9qpXu4MOw01ccjSPHA/TgZ+FDOZb3U9y

ABXB64uoxbxr5zIAgYKoQUOoX3S0gwDo9omWcnAPU4fjtT7Es/3HNjtSet3TGW68

J7vbhPIovtusLqH1/AUKmEVspeUKkn9ero0Ee9ruuP5HALb8zstG

-----END CERTIFICATE-----

 

 

5. 인증서 Config 파일 (test.conf)

 

[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C=KR
ST=Seoul
L=Seoul
O=COMPANY
OU=DEV
emailAddress=test@test.com
CN = testmachine

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 111.111.111.111
DNS.1 = test.com

 

위에서 만들다 보면 계속 같은 내용을 써야 한다. 그래서 그 부분을 파일로 만들어 놓고 csr, crt 생성할때 사용하면 된다.
 
openssl req -new -key private.key -out private.csr -config test.conf
openssl req -x509 -days 365 -key private.key -in private.csr -out mycommoncrt.crt -days 365 -config test.conf
 
그리고 이렇게 해서 인증서를 만들었을때 subjectAltName 이 안들어간다 . 그 부분이 필요할 경우에는 이렇게 명령어를 사용하면 된다. 
 
openssl req -x509 -days 365 -key private.key -in private.csr -out mycommoncrt.crt -days 365 -config test.conf -extensions req_ext
 
 

 

openssl 팁 몇가지
 
openssl x509 -text -noout -in <인증서파일>  : 인증서 내용을 볼수 있다.
 
openssl x509 -in mycommoncrt.crt -out mycommonpem.pem -outform PEM  : CRT 파일을 PEM 파일로 변환한다.

 

참고자료

 

https://www.comodossl.co.kr/certificate/ssl-installation-guides/Apache-csr-crt.aspx

https://www.kicassl.com/sslcert/sslcert/formSslCert.sg

http://namjackson.tistory.com/24

728x90
반응형

'Development > Tech&Seminar' 카테고리의 다른 글

Google Cloud Hackathon 간단한 후기  (0) 2018.10.08
TCC가 뭐지???  (0) 2018.09.07
#2 OpenID Connect Flow  (0) 2018.08.14
#1 Open ID Connect 가 뭐야???  (0) 2018.08.07
Google Cloud Study Jams 후기  (0) 2018.05.15

+ Recent posts