Proxmox 로 홈 서버 구축하기: (4) API 이용하기
1. 권한 추가 및 인증서 생성
Proxmox API 문서: https://pve.proxmox.com/pve-docs/api-viewer/
Proxmox VE API Documentation
pve.proxmox.com
API 문서를 보고 postman 으로 요청을 보내게 되면 Empty List 가 응답되는 것을 볼 수가 있다.
권한이 없기 때문이다.
권한을 추가해주기 위해 GUI 로 제공되는 proxmox 가 설치된 8006 포트로 접속해준다.
해당 메뉴로 들어가서 아래의 사진과 같이 해준다.
Permissions > Add > API Token Permission
Header
key: Authorization
value : PVEAPIToken=[Token ID]=[Secret]
/etc/ssl/certs
접속하려는 곳에서 내려받고 더블클릭하면 인증서를 설치하겠냐는 창이 뜬다.
도메인 확인
root@pve:~# cat /ctc/hosts
cat: /ctc/hosts: No such file or directory
root@pve:~# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
[Proxmox 가 설치된 내부ip] [본인이 등록한 도메인주소]
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
도메인 주소 등록
여기서 도메인은 Proxmox 설치 시에 설정한 도메인을 의미한다.
2. Proxmox 자체 인증서 등록
cat /etc/pve/local/pve-ssl.pem
우선 인증서가 잘 설치되어있는지 확인한다.
나는 도메인명이 pve 인데 도메인명에 따라 파일 이름이 다를 수도 있다.
잘 설치되어있다면 아래의 명령어를 수행한다.
Proxmox 서버 (Ubuntu)
# jdk 필요하므로 설치
sudo apt update
sudo apt install openjdk-17-jdk
# 환경변수 세팅
echo "export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))" >> ~/.bashrc
source ~/.bashrc
# der 확장자로 변환
openssl x509 -in /etc/pve/local/pve-ssl.pem -outform der -out proxmox.der
# cacerts 생성
keytool -import -alias proxmox -keystore $JAVA_HOME/lib/security/cacerts \ -file proxmox.der -storepass [비밀번호]
# Trust this certificate? [no]:
# 마지막에 Yes 입력
# Certificate was added to keystore 나오고 에러 메시지 없으면 성공
서버에서 등록이 정상적으로 진행되었다면 요청을 보내는 클라이언트 쪽에서도 인증서를 설치해주어야한다.
요청 서버 (Windows)
# pve-ssl.pem 파일을 클라이언트 쪽에 복사 (파일질라 이용)
# cmd 관리자 권한으로 실행
# 파일 있는 경로에서 der 로 변환 명령어 실행
openssl x509 -in pve-ssl.pem -outform der -out proxmox.der
# jdk 경로 확인하고 cacerts 생성 명령어 실행
keytool -import -alias proxmox -keystore "C:\Program Files\Java\jdk-17\lib\security\cacerts" -file proxmox.der -storepass [비밀번호]
# 위와 똑같이 Trust this certificate? [no]:
# 마지막에 Yes 입력
# Certificate was added to keystore 나오고 에러 메시지 없으면 성공
혹시나 openssl 명령어를 사용할 수 없다면
openssl 홈페이지(https://slproweb.com/products/Win32OpenSSL.html)에 가서 winx64 설치한다.
이미 코드가 작성되어있다면 생성 되고 나면 다시 애플리케이션 재실행(JVM 재기동)한다.
아래는 요청을 수행하기 위한 Config 와 Client 클래스 파일이다.
Config
@Configuration
public class ProxmoxConfig {
@Value("${proxmox.url}")
private String url;
@Value("${proxmox.token}")
private String token;
public String getUrl() {
return url;
}
public String getToken() {
return token;
}
}
Client
@Component
public class ProxmoxClient {
private final ProxmoxConfig config;
public ProxmoxClient(ProxmoxConfig config) {
this.config = config;
}
@Bean
public RestClient restClient() {
try {
// 기본 SSLContext 사용 (인증서 검증 활성화)
SSLContext sslContext = SSLContext.getDefault();
HttpClient httpClient = HttpClient.newBuilder()
.sslContext(sslContext)
.build();
return RestClient.builder()
.baseUrl(config.getUrl())
.defaultHeaders(headers -> {
headers.add("Authorization", config.getToken());
headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
})
.requestFactory(new JdkClientHttpRequestFactory(httpClient))
.build();
} catch (Exception e) {
throw new RuntimeException("RestClient 생성 실패", e);
}
}
}
application.yml
proxmox:
url: https://[도메인]:8006/api2/json/nodes/pve/qemu
token: PVEAPIToken=[Token ID]=[Secret]
여기서 중요한 것은 최초에 proxmox 설치 시에 등록한 도메인으로 설정해야 정상적인 요청이 갑니다!
이제 내가 작성한 애플리케이션에서 요청을 수행하면 성공적으로 응답을 받는다!