2014-12-10 3 views
3

https로만 실행되도록 다트 http 서버를 설정하려고합니다. 그래서 나는 HttpServer.bindSecure을 사용할 필요가 있지만, 무엇을 certificateName으로 전달해야하는지, 그리고 requestClientCertificate이 참이되는지를 설명하는 것이 명확하지 않아서 보안 성이 다소 저하되거나 보안에 아무런 영향을주지 않습니다. HttpServer page의 상단에있는 작은 샘플 코드는 certificateName: 'localhost_cert'으로 전달되지만 그 전에는 데이터베이스로 처리하지만 어쨌든 사용하지는 않습니다. 누구든지 이러한 가치가 무엇인지, 그리고 그들이 안전하도록하기 위해 필요한 것은 무엇인지 더 자세히 설명 할 수 있습니까?dart에서 보안 http 서버를 만드는 방법은 무엇입니까?

+0

이 문제는이 주제와 관련된 여러 링크를 포함하며 유용한 정보로 이어질 수 있습니다. https://code.google.com/p/dart/issues/detail?id=20967 –

+0

덕분에이 링크는 매우 유용합니다. 첫 번째 댓글 http://jamesslocum.com/post/70003236123에 링크 된 대화는 이것이 직접적인 대답으로 가장 가까이 올 것이라고 기대합니다.하지만 상관없이 좋은 기사입니다. – 0xor1

+0

CA 인증서를 추가하려면이 자습서를 https://gist.github.com/stevenroose/e6abde14258971eae982 –

답변

2

매개 변수 bindSecure은 클라이언트 인증서를 지정하는 데 사용됩니다. 클라이언트 인증서는 서버에서 클라이언트를 식별하고 권한을 부여하는 데 사용되며이 질문의 목적이 아닙니다. IE9 및 Windows 7의 Dart에는 클라이언트 인증서를 사용하는 known issue이 있습니다.

certificateName 매개 변수는 인증서 데이터베이스에있는 인증서의 별칭을 지정하는 데 사용됩니다. certutil을 사용하여 데이터베이스로 인증서를 가져올 때 -n <nickname> 옵션을 사용하여 인증서 닉네임을 지정합니다.

에 다음 단계를 사용

  • 암호 <password>과 디렉토리 <dir>에서 새 인증서 데이터베이스를 작성하고

  • (certutil을 포함) NSS 유틸리티를 설치

    • 닉네임 <host>으로 식별 된 자체 서명 또는 구입 한 인증서를 가져 와서 다음 샘플을 사용하여 HTTPS 서버를 생성하는 데 사용할 수 있습니다. 전자 코드. 닉네임은 임의로 선택할 수 있지만이 예제에서는 호스트 이름을 사용합니다. 이 단계는 Ubuntu 14.04 및 Dart SDK 1.6 (현재 마지막 안정 버전) 1.8.3에서 작동하는 것으로 확인되었습니다.


      1. sudo apt-get install libnss3-tools

      2. CD 인증서 데이터베이스에 사용할 암호 파일을 작성하여 인증서 데이터베이스
        cd <dir>

      3. 를 포함 할 디렉토리로 NSS 유틸리티를 설치합니다
        echo "<password>" > pwdfile

      4. 인증서 데이터베이스를 만들고
        certutil -N -d 'sql:./' -f pwdfile

      5. 다음 중 하나를

        • 자체 서명 된 인증서 생성 : <host> 호스트 ("일반 이름"입니다

          certutil -S -s "cn=<host>" -n "self signed for dart" -x -t "C,C,C" -m 1000 -v 120 -d "sql:./" -k rsa -g 2048 -f pwdfile

          을), 예를 들어 "localhost"와 같은 인증서를 생성합니다.

        • 또는 "myhost.com"예를 들어, 먼저 실제 도메인 <host>위한 서명 요청을 생성하여 인증서를 구입 :

          certutil -R -s "CN=<host>, O=None, L=San Diego, ST=California, C=US" -a -g 2048 -o <host>.csr -d "sql:./"

          그런 다음 파일 <host> .csr의 내용을 지정하라는 메시지가 표시되면 서명 기관에서 인증서를 구입할 때 CSR에 대해

          복사

          가져 오기 데이터베이스
          certutil -A -n <host> -t "p,p,p" -i <host>.crt -d "sql:./"

          중간 인증서를 사용하는 것이 필요한 경우에 인증서가 .crt <host>라는 이름의 파일에 구입 한 인증서, 그것은 같은 가져올 수 있습니다 :
          certutil -A -n my_intermediate_certificate -t "p,p,p" -i intermediate.crt -d "sql:./"
          여기서 "intermediate.crt"는 서명 기관에서 다운로드 한 중간 인증서 파일입니다.

      6. 인증서가이 인증서를 사용하고 HTTPS 서버를 만들려면

        certutil -L -n <host> -d "sql:./"
        certutil -L -n my_intermediate_certificate -d "sql:./"

    데이터베이스에 존재하는지 확인, 다음을 수행하십시오

    ,363,210
    // Initialize secure socket to use certificate database (note: replace `<dir>` 
    // with the absolute path to the certificate database directory, and `<password>` 
    // with the value chosen above) 
    SecureSocket.initialize(database: "<dir>", password: "<password>"); 
    
    // Bind secure HTTP server to specified host and port (typically 443) 
    HttpServer.bindSecure("<host>", 443, certificateName: "<host>") 
        .then((HttpServer httpServer) { 
    
        // Listen for incoming requests 
        httpServer.listen((HttpRequest httpRequest) { 
    
         // TODO: process request 
        }); 
        }) 
        .catchError((error) { 
    
        // TODO: handle error 
        }); 
    

    업데이트 내가 지금 여기에 질문에 대한 답변 도움이 될 수 있습니다 자세한 내용은, 주석에 응답 할 수있는 충분한 명성 포인트가없는

    : 클라이언트 인증서는 클라이언트 - 서버 통신을 암호화하는 데 사용되지 않습니다 HTTPS를 통해 웹 브라우저와 웹 서버간에 보안 통신을 설정하는 일반적인 시나리오에서는 필요하지 않습니다. 위에 설명 된 단계는 bindSecure을 사용하여 Dart에서 HTTPS 서버를 만드는 방법을 보여줍니다.

  • +0

    으로 작성하십시오. 첫 번째 단락에서 IE9의 알려진 버그가 있다는 것을주의하십시오. 나는 다트가 IE10 + 만 지원한다고 믿고 있습니다. 따라서 이것은 실제로 버그가 아니며 단지 지원되지 않습니다. – 0xor1

    +0

    '클라이언트 인증서는 서버가 클라이언트를 식별하고 승인하는 데 사용됩니다.이 질문은이 질문의 목적이 아닙니다.' - 내가 원하는 것은 클라이언트와 서버 간의 모든 통신이 일반 HTTP가 아닌 https를 통해 암호화되도록하는 것입니다. 클라이언트 식별 및 권한 부여에 관심이 없다면 여전히 인증서 데이터베이스로이 절차를 수행해야합니까? 또는 https를 통해 com을 보유하기위한 전제 조건입니까? – 0xor1

    +0

    감사합니다. 업데이트를 위해 서버가 http가 아닌 https 만 사용하도록하려면 어떻게해야합니까? 아니면이 옵션이 아닌가요? 내가 원하는 것은 내 서버가 https만을 받아 들여서 https로 응답하는 것입니다. – 0xor1

    관련 문제