web.config 파일을 사용하여 HTTPS를 강제 실행하는 방법


220

나는 이것에 대한 해결책을 찾으려고 Google과 StackOverflow를 검색했지만 모두 ASP.NET 등과 관련이있는 것 같습니다.

일반적으로 서버에서 Linux를 실행하지만이 클라이언트 하나에 IIS 7.5 (및 Plesk 10)가있는 Windows를 사용하고 있습니다. 이것이 IIS와 web.config 파일에 약간 익숙하지 않은 이유 입니다. 에서 .htaccess파일 당신은 프로토콜이 따라 HTTPS 및 리디렉션 여부를 감지하는 재 작성 조건을 사용할 수 있습니다. web.config 파일을 사용하거나 심지어 설치 한 ' URL Rewrite '모듈을 사용하여이를 달성 하는 간단한 방법 이 있습니까?

ASP.NET에 대한 경험없으므로 솔루션에 관련된 경우 구현 방법에 대한 명확한 단계를 포함하십시오.

PHP가 아닌 web.config 로이 작업을 수행하는 이유 는 사이트 내의 모든 자산에 HTTPS를 강제 적용하기 때문입니다.



답변:


427

URL 재 작성 모듈, 바람직하게는 v2가 필요합니다 (v1이 설치되어 있지 않으므로 작동한다고 보장 할 수는 없지만).

다음은 그러한 web.config의 예입니다. 301 영구 리디렉션을 사용하여 모든 리소스에 대해 HTTPS를 강제 적용합니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

PS 이 특정 솔루션은 URL 재 작성 모듈 만 사용하므로 ASP.NET/PHP 또는 다른 기술과는 아무런 관련이 없습니다. 요청이 코드가있는 지점에 도달하기 전에 초기 / 낮은 수준 중 하나로 처리됩니다. 처형된다.


6
@BenCarey 또한 Strict-Transport-Security헤더를 봐야합니다 : en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne

22
쿼리 문자열이 이미 {REQUEST_URI}의 일부이므로 쿼리 문자열을 추가하지 않도록 리디렉션을 변경하는 것이 좋습니다 (그렇지 않으면 매개 변수가 두 번 추가됨). <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
franzo

6
이것은 작동하지만 불행히도 localhost에서도 작동합니다. 이것을 피하기 위해 이것을 <conditions>에 추가 할 수 있습니다 : <add input = "{HTTP_HOST}"pattern = "localhost"negate = "true"/>
wezzix

5
AWS Elastic Beanstalk를 사용하여이 방법을 사용하면 수정 될 때까지 302 개의 리디렉션이 너무 많이 발생했습니다. <match url=".*"/>to<match url="http://*.*" />
Kevin R.

1
@Sam URL 재 작성 모듈이 설치되어 있지 않을 수 있습니다. 기본적으로 IIS와 함께 제공되지 않으므로 별도로 설치해야합니다. 예 : docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/…
LazyOne

80

ASP.NET MVC를 사용하는 경우 RequireHttpsAttribute 를 사용하여 모든 응답을 HTTPS로 만들 수 있습니다.

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

사이트를 보호하기 위해 수행 할 수있는 다른 작업 :

  1. 위조 방지 토큰이 SSL / TLS를 사용하도록합니다.

    AntiForgeryConfig.RequireSsl = true;
  2. Web.config 파일을 변경하여 쿠키가 기본적으로 HTTPS를 요구하도록 요구 :

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
  3. NWebSec.Owin NuGet 패키지를 사용하고 다음 코드 줄을 추가하여 사이트 전체에서 엄격한 전송 보안 (HSTS)을 활성화하십시오. 아래에 사전로드 지시문을 추가하고 사이트를 HSTS 사전로드 사이트에 제출하십시오 . 여기여기에 더 많은 정보가 있습니다 . OWIN을 사용하지 않는 경우 NWebSec 사이트 에서 Web.config 메소드를 읽을 수 있습니다.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
  4. NWebSec.Owin NuGet 패키지를 사용하고 사이트 전체에서 HPKP (Public Key Pinning)를 활성화하려면 다음 코드 줄을 추가하십시오. 여기여기에 더 많은 정보가 있습니다 .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHpkp(options => options
        .Sha256Pins(
            "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
  5. 사용 된 URL에 https 체계를 포함 시키십시오. 일부 브라우저에서 구성표를 모방하면 CSP (콘텐츠 보안 정책) HTTP 헤더 및 SRI (하위 리소스 무결성) 가 제대로 작동하지 않습니다. HTTPS에 대해 명시 적으로 작성하는 것이 좋습니다. 예 :

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
  6. 사용 ASP.NET MVC 상용구 에서이 모든 훨씬 더 내장 된 프로젝트를 생성하려면 Visual Studio 프로젝트 템플릿을. 당신은 또한에 코드를 볼 수 있습니다 GitHub의 .


4
이 질문은 ASP.NET을 요구하지만 WebForms 또는 MVC를 언급하지 않으므로 MVC를 사용하는 사람들 (HTTP를 강제하기 위해 Web.config 파일을 사용하지 않는 사람)에 대해서는 포괄적으로 대답했지만 아직 다운 다운되었습니다.
Muhammad Rehan Saeed 2016 년

6
a) 솔루션은 작동하지만 상황이 변경되었습니다.이 두드러지고 높은 등급의 질문은 MVC에 내장 된 것을 사용하여 업데이트 된 답변을받을 가치가 있습니다. b) 대답은 모든 기지를 포함하려고 시도합니다. 문제는 간단하지 않으므로 전체 사이트에서 HTTPS를 사용하려면 web.config 파일을 변경하는 것보다 훨씬 많은 것이 필요합니다. 독자들은 Web.config 파일을 변경하는 것만으로도 잘못 생각할 수 있습니다. 불완전하거나 오래된 답변이 없으면 보안이 충분히 어렵습니다.
Muhammad Rehan Saeed

11
제 생각에는 이것은 훌륭하고 귀중한 답변입니다. 누군가 Google에서 주제를 검색하고이 질문에 대한 답변을 받으면 귀하의 답변이 여기에 있습니다.
James K. Polk 대통령

1
@MuhammadRehanSaeed 좋은 포스트. 목록에 SRI를 추가 하시겠습니까? scotthelme.co.uk/subresource-integrity
Nathan

1
@MuhammadRehanSaeed true- "귀하의 사이트를 보호하기 위해 할 수있는 다른 일들"이라는 생각이 떠 올랐습니다. :)
Nathan

14

LazyOne의 답변을 보강하기 위해 여기에 주석이 달린 답변이 있습니다.

<rewrite>
  <rules>
     <clear />
     <rule name="Redirect all requests to https" stopProcessing="true">
       <match url="(.*)" />
         <conditions logicalGrouping="MatchAll">
           <add input="{HTTPS}" pattern="off" ignoreCase="true" />
         </conditions>
         <action 
            type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
            redirectType="Permanent" appendQueryString="false" />
     </rule>
  </rules>
</rewrite>

이 서버에 이미 정의되어있는 다른 모든 규칙을 지우십시오. "모든 요청을 https로 리디렉션"이라는 새 규칙을 만듭니다. 이 규칙을 처리 한 후에는 더 이상 규칙을 처리하지 마십시오! 들어오는 모든 URL과 일치합니다. 그런 다음 다른 모든 조건이 충족되는지 확인하십시오. HTTPS가 꺼져 있습니다. 글쎄, 그것은 하나의 조건 일뿐입니다 (그러나 그것이 사실인지 확인하십시오). 그렇다면 301 Permanent 리디렉션을 다시 클라이언트로 보냅니다 http://www.foobar.com/whatever?else=the#url-contains. 쿼리 문자열은 쿼리 문자열을 복제하므로 쿼리 문자열을 추가하지 마십시오!

이것이 속성, 속성 및 일부 값의 의미입니다.

  • clear 는 그렇지 않으면 상속 할 수있는 모든 서버 규칙을 제거합니다.
  • 규칙규칙을 정의합니다.
    • 이름 규칙에 대한 임의의 (하지만 고유의) 이름을.
    • stop : IIS 요청 파이프 라인으로 요청을 즉시 전달할지 또는 추가 규칙을 먼저 처리 할지를 처리합니다.
  • 이 규칙을 실행할 때 일치합니다 .
    • URL 을 평가할 패턴을 url
  • 조건 이 규칙을 실행하는 경우에 대한 추가 조건; 조건은 처음 일치하는 경우에만 처리됩니다.
    • 모든 조건이 참 ( MatchAll) 이어야하는지 또는 조건 중 하나라도 참 ( ) 이어야하는지 여부를 논리 그룹화 합니다 MatchAny. AND vs OR과 유사합니다.
  • add 는 충족해야하는 조건을 추가 합니다.
    • 조건이 평가하고있는 입력을 입력 하고; 입력은 서버 변수 일 수 있습니다.
    • 입력을 평가할 표준을 패턴 화 합니다.
    • 대문자가 중요한지 여부를 무시하십시오 .
  • 조치는 무엇을해야하는 경우 match와는 conditions모두 해당.
    • 유형 은 일반적으로 redirect(클라이언트 측) 또는 rewrite(서버 측) 일 수 있습니다.
    • 이 규칙의 결과로 무엇을 만들지 url ; 이 경우 https://두 개의 서버 변수로 연결 하십시오.
    • redirect 사용할 HTTP 리디렉션을 입력하십시오. 이것은 301 Permanent입니다.
    • appendQueryString 결과의 끝에 쿼리 ​​문자열을 추가할지 여부 url; 이 경우 {REQUEST_URI}이미 포함되어 있기 때문에 false로 설정 합니다.

서버 변수는

  • {HTTPS}어느 하나 OFF또는 ON입니다.
  • {HTTP_HOST}입니다 www.mysite.com.
  • {REQUEST_URI} 나머지 URI를 포함합니다 (예 : /home?key=value
    • 브라우저는 #fragment(LazyOne의 주석 참조)를 처리합니다 .

참조 : https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


1
그러나 한 가지 참고 사항 : URL의 (부분) 부분은 /home?key=value#fragment로컬에서 사용되도록 브라우저에서 서버로 설정하지 않습니다.
LazyOne

@LazyOne 질문. 위의 web.config를 성공적으로 사용하여 greenearth.game/about#foo 에서 HTTPS 로 리디렉션 합니다. HTTPS 로의 전환에는 #foo 조각이 포함됩니다. #foo 부분이 서버로 전송되지 않았다면 리디렉션에 어떻게 포함됩니까?
Shaun Luttin

브라우저에서 처리합니다. Chrome에서 네트워크 탭을 열거 나 Firefox와 유사한 네트워크 탭을 열고 실제로 요청 된 URL을 확인하십시오 (예 : http://www.example.com/members#oops요청이 전송 http://www.example.com/members된 후 HTTPS 버전으로 리디렉션 됨 https://www.example.com/members-브라우저가 나머지를
수행함

@LazyOne 감사합니다. 올바르게 기억하면 조각에 리디렉션에 포함되지 않는 WebKit 버그가 몇 가지 있습니다. 따라서 이것은 의미가 있습니다. bugs.webkit.org/show_bug.cgi?id=24175
Shaun Luttin

1
en.wikipedia.org/wiki/Fragment_identifier는 - "고객들은 문서를 검색 할 때 서버에 URI-조각을 보낼 생각되지 않으며, 로컬 응용 프로그램의 도움없이 조각이 HTTP 리디렉션에 참여하지 않는다 (아래 참조)" - 내가 당신의 마지막 의견을 잘못 이해했을 경우를 대비해서
LazyOne

6

받아 들인 대답이 효과가 없었습니다. 나는이 블로그 의 단계를 따랐다 .

나에게 없어진 요점은 IIS 용 URL 다시 쓰기 도구를 다운로드하여 설치해야한다는 것입니다. 여기 에서 찾았습니다 . 결과는 다음과 같습니다.

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>

1

.Net Core에서 https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl 의 지침을 따르십시오.

startup.cs에서 다음을 추가하십시오.

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

Http를 Https로 리디렉션하려면 startup.cs에 다음을 추가하십시오.

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);

0

우수한 NWebsec 라이브러리는 다음의 upgrade-insecure-requests태그를 사용하여 HTTP에서 HTTPS로 요청을 업그레이드 할 수 있습니다 Web.config.

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>

0

내 환경에 URL 다시 쓰기를 설치할 수 없으므로 다른 경로를 찾았습니다.

이것을 web.config에 추가하면 오류 다시 쓰기가 추가되고 IIS 7.5에서 작동했습니다.

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >    
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

그런 다음 조언을 따르십시오 : https://www.sslshopper.com/iis7-redirect-http-to-https.html

리디렉션 (redirectToHttps.html)을 수행하는 html 파일을 만들었습니다.

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

한 곳에서 다른 곳의 모든 조각을 찾을 수 없으므로 누군가 가이 기능을 유용하게 사용하기를 바랍니다.


-7

간단한 방법은 HTTP 요청에 대해 사용자 지정 오류 파일을 보내도록 IIS를 알려주는 것이다. 그러면 파일에 메타 리디렉션, JavaScript 리디렉션 및 링크가 포함 된 지침 등이 포함될 수 있습니다. 중요하게도 사이트 (또는 폴더)에 대해 "SSL 필요"를 확인할 수 있습니다.

</configuration>
</system.webServer>
    <httpErrors>
        <clear/>
        <!--redirect if connected without SSL-->
        <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/>
    </httpErrors>
</system.webServer>
</configuration>

다운 보트가 왜 필요한가요? 그것은 작동하고 질문에 대답합니다.
리디렉션

14
파일을 찾을 수 없다고 Google에 알리고 JavaScript를 사용하여 리디렉션하기 때문에 이는 일반적으로 좋지 않습니다.
토마스 베넷
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.