Project/Home Server

Proxmox 로 홈 서버 구축하기: (4) API 이용하기

haema_dev 2025. 4. 26. 11:58

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 설치 시에 등록한 도메인으로 설정해야 정상적인 요청이 갑니다!

 

 

이제 내가 작성한 애플리케이션에서 요청을 수행하면 성공적으로 응답을 받는다!