ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Proxmox 로 홈 서버 구축하기: (4) API 이용하기
    Project/Home Server 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 설치 시에 등록한 도메인으로 설정해야 정상적인 요청이 갑니다!

     

     

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

Designed by Tistory.