error: no pg_hba.conf entry for host “비밀스런 IP”, user “비밀스런 유저 이름”, database “비밀스런 DB 이름 “, no encryption at Parser.parseErrorMessage (/Users/yunmun-yeol/Documents/nestjs/TicketNest-dev/node_modules/pg-p..

2023. 8. 10. 16:50에러대응

문제 상황

 

postgreSQL 을 사용한 RDS 를 로컬에서 테스트를 하려고 하던중 발생한 에러이다.

 

error: no pg_hba.conf entry for host “비밀스런 IP”, user “비밀스런 유저 이름”, database “비밀스런 DB 이름 “, no encryption
    at Parser.parseErrorMessage (/Users/yunmun-yeol/Documents/nestjs/TicketNest-dev/node_modules/pg-protocol/src/parser.ts:369:69)
    at Parser.handlePacket (/Users/yunmun-yeol/Documents/nestjs/TicketNest-dev/node_modules/pg-protocol/src/parser.ts:188:21)
    at Parser.parse (/Users/yunmun-yeol/Documents/nestjs/TicketNest-dev/node_modules/pg-protocol/src/parser.ts:103:30)
    at Socket.<anonymous> (/Users/yunmun-yeol/Documents/nestjs/TicketNest-dev/node_modules/pg-protocol/src/index.ts:7:48)
    at Socket.emit (node:events:514:28)
    at addChunk (node:internal/streams/readable:343:12)
    at readableAddChunk (node:internal/streams/readable:316:9)
    at Socket.Readable.push (node:internal/streams/readable:253:10)
    at TCP.onStreamRead (node:internal/stream_base_commons:190:23)

 


orm.config.ts 파일을 아래처럼 바꿔 보았다.

 

@Injectable()
export class typeORMConfig implements TypeOrmOptionsFactory {
  constructor(private configService: ConfigService) {}

  createTypeOrmOptions(): TypeOrmModuleOptions {
    return {
      type: 'postgres',
      host: this.configService.get('DB_HOST'),
      port: this.configService.get<number>('DB_PORT'),
      username: this.configService.get('DB_USER'),
      password: this.configService.get('DB_PASSWORD'),
      database: this.configService.get('DB_DATABASE'),
      entities: [UserEntity, GoodsEntity, BookingEntity], // TypeORM이 엔티티를 인식할 수 있게 설정
      synchronize: false, //! 주의! 이거 true 되면 데이터베이스 리셋됩니다
      logging: true, // 개발 편의를 위해 추가, 배포시 지워도 됩니다.
      ssl: true, // <-- 추가한 부분
    };
  }
}

 

앞전의 에러가 해결되었다. 하지만 다른 에러가 발생하였다.

 

Error: self-signed certificate in certificate chain
    at TLSSocket.onConnectSecure (node:_tls_wrap:1627:34)
    at TLSSocket.emit (node:events:514:28)
    at TLSSocket._finishInit (node:_tls_wrap:1038:8)
    at TLSWrap.ssl.onhandshakedone (node:_tls_wrap:824:12)

 


SOLVE

 

다시 orm.config.ts 파일을 수정

 

createTypeOrmOptions(): TypeOrmModuleOptions {
    return {
      // ... 나머지 설정들
      ssl: {
        rejectUnauthorized: false,
      },
    };
  }

오류없이 작동을 했다.

 

하지만 이렇게 한다면 중간자 공격(Man-in-the-middle Attack) 에 취약해 질 수 있다.

프로덕션에서는 적절한 SSL 인증서를 구성하거나 AWS RDS 인증서를 노드에 추가하는 것이 좋을 듯 하다.

 

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/PostgreSQL.Concepts.General.SSL.html

 

PostgreSQL DB 인스턴스와 함께 SSL 사용 - Amazon Relational Database Service

PostgreSQL DB 인스턴스와 함께 SSL 사용 Amazon RDS는 PostgreSQL DB 인스턴스를 위한 SSL 암호화를 지원합니다. SSL을 사용하여 애플리케이션과 PostgreSQL DB 인스턴스 사이의 PostgreSQL 연결을 암호화할 수 있습

docs.aws.amazon.com