Soru Bir konsol uygulamasından HTTPS?


Kullanmıyorum IISve bu bilgisayara bile yüklenmedi. Bende hiç yok app.config dosya veya web.config konsolumdaki dosyalar barındırıldı WCF  DİNLENME hizmet. Ancak HTTPS'yi ana makine konsolu uygulamasında çalıştırmayı denemek istiyorum:

class Program
{
    static void Main(string[] args)
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        //WebHttpBinding binding = new WebHttpBinding();
        //binding.Security.Mode = WebHttpSecurityMode.Transport;
        host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
        host.Open();

        Console.WriteLine("Host opened");
        Console.ReadLine();

Hizmetimin çalışabilmesinin bir yolu var mı HTTPS?


30
2018-04-23 02:39


Menşei


stackoverflow.com/questions/3140526/wcf-https-vs-http https kullanarak örnek bir konsol programına sahiptir ve geliştirmede kullanılmak üzere kendinden imzalı bir sertifika oluşturma hakkında bazı bilgilere sahiptir. - E.Z. Hart
Bu webHttpBinding değil wsHttpBinding, bu saf wcf mayın wcf dinlenme olarak maruz kalmaktadır. Bir fark yaratacağından emin değiller ama bunlar oldukça karmaşık görünüyor ve nereden başlayacağımı bilmiyorum? Güzel bulmak için +1 tho. - Kirsty White
Aşağıda verilen cevap (lar) meli Bu soruna adım adım tavsiyelerde bulunarak eksiksiz ve sağlam çözümler sunar. Bu soruna genel bir çözüm olduğunu unutmayın (stunnel) SSL veya TLS'nin uygulanmasının temel uygulamanızda pratik veya imkansız olduğu durumlar için. Bu, resmi çözümün etkili bir şekilde çalışmadığı ya da test bağlantı paritesinin gerekli olduğu durumlarda özellikle yararlıdır, bu yüzden, yararlı olduklarında zamanınız için püf noktalarınızda saklamanızı öneririz. - MrGomez
Bu proje İstediğinizi yapar, ancak belli ki maalesef config dosyalarını kullanır. - ldgorman


Cevaplar:


  1. Bir kök yetkili ve HTTPS sertifikası oluştur ve yükle

    Komut istemi Yönetici olarak aç:

    Klasör oluşturun C:\Certs ve ona gidin.

    #Root Authority
    makecert.exe -r -pe -n "CN=My Root Authority" -ss CA -sr LocalMachine -a sha1 -sky signature -cy authority -sv CA.pvk CA.cer
    
    #Certificate
    makecert.exe -pe -n "CN=localhost" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv server.pvk server.cer
    
    #key
    pvk2pfx.exe -pvk server.pvk -spc server.cer -pfx server.pfx
    

    ** makecert ve pvk2pfx için varsayılan konum C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin

  2. Sertifikaları yükle

    Komut satırından:

    certmgr.exe -add CA.cer -r LocalMachine -s CertificateAuthority

    certmgr.exe -add server.pfx -r LocalMachine -s Benim-tüm

    MMC'den:

    MMC komut istemine gidip MMC yazın. Bu boş MMC konsolu açılacaktır. Ekle / kaldır ek bileşenini tıklayın. Sertifika ekle ve Bilgisayar Hesabı / Yerel bilgisayar'ı seçin.

    Ara Sertifika Yetkililerine / Sertifikalarına gidin. Sağ Tıkla ve içe aktar'ı seçin. Creatd CA.cer dosyanızın bulunduğu klasöre gidin ve içe aktarmak için tıklayın.

    Kişisel / Sertifikalara gidin ve Al'ı sağ tıklayın. Server.pfx dosyanızı bulun (mevcut uzantılar listesinden PFX'i seçmeniz gerekir) ve bu dosyayı içe aktarın. Tamamlandığında sertifikayı çift tıklayarak açıp not edin. başparmak izi Ayrıntılar altında. Bunu yapıştırın Not Defteri ve fazladan kaldır ? başında ve boşlukları kaldırın.

    Sunucu parmak izi sertifikası almak için bunu Güç kalkanı:

    $getThumb = Get-ChildItem -path cert:\LocalMachine\TrustedPeople | where { $_.Subject -match "CN=localhost" }
    $getThumb.thumbprint
    
  3. WCF portunu kaydet ve eşleştir netsh

    WCF bağlantı noktasına harita

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=73269e9b554f58d75e77880f5ff72b50c8d724ee appid={e2eaacd9-92e6-43cc-b51c-7a7887149607}
    
    appid - any GUID
    certhas - this is the thumb print from the step 2
    
  4. Konakınızı kurun

    HTTPS'ye ayarla ve taşıma güvenliğini etkinleştir:

    string baseAddress = "https://" + Environment.MachineName + ":8000/Service";
    var binding = new WebHttpBinding();
    binding.Security.Mode = WebHttpSecurityMode.Transport;
    

Detaylı referanslar

Sslcert ile sorun yaşarsanız:


30
2018-05-04 15:50



msdn.microsoft.com/en-us/library/ms789011.aspx Bu da kullanım olabilir. - Garrith Graham
Bu sadece servis konuşması yapmaktır. Güvenlik yığınına eklemeye devam edebilirsiniz. binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; tıpkı diğer herhangi bir kendiliğinden barındırılmayan servis gibi. - Petar Vučetin
sen nasıl yazıyorsun? - Kirsty White
Visual Studio x64 Win64 Komut İstemi'ni açın (2010) - Petar Vučetin
Bunu bana hayatım boyunca işe yaramadı ... İstemci tarafında hizmeti keşfetmek, "makine aktif olarak reddediyor ya da sertifika yapılandırılmamış" diyor. - arviman


VS.NET 2010'da yeni bir konsol uygulaması projesi oluşturun. Şimdi dll'lere referans ekleyin.

 a.  System.ServiceModel
 b.  System.ServiceModel.Web
 c.  System.Runtime.Serialization

Program.cs Main yönteminin aşağıdaki kodu vardır:

public class Program
    {
        public static void Main(string[] args)
        {
            Uri baseAddress = new Uri("https://"+Environment.MachineName+":54321/hello");
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {                
                WebHttpBinding web = new WebHttpBinding();
                web.Security.Mode = WebHttpSecurityMode.Transport;                
                host.AddServiceEndpoint(typeof(IHelloWorldService), web, "").Behaviors.Add(new WebHttpBehavior());                                
                host.Credentials.ServiceCertificate.Certificate = (X509Certificate2)GetX509Certificate();                               
                host.Open();
                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();                
                host.Close();
            }
        }

        private static X509Certificate GetX509Certificate()
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.OpenExistingOnly);
            X509Certificate certificate = null;
            X509Certificate2Collection cers = store.Certificates.Find(X509FindType.FindBySubjectName, "localhost", false);            
            if (cers.Count > 0)
            {
                certificate = cers[0];
            }
            store.Close();
            return certificate;
        }
    }

[ServiceContract]
    public interface IHelloWorldService
    {
        [WebGet(UriTemplate="SayHello/{name}")]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

Şimdi aşağıdaki komutların bir toplu iş dosyasını oluşturarak (MSDN'den alınan) ve VS.NET komut isteminden çalıştırılarak sertifika oluşturuyoruz:

echo off
setlocal

call :setscriptvariables %1
IF NOT DEFINED SUPPORTED_MODE call :displayusage
IF DEFINED SUPPORTED_MODE call :cleancerts
IF DEFINED SETUP_SERVICE call :setupservice
IF DEFINED SETUP_CLIENT call :setupclient
GOTO end

:cleancerts
REM cleans up certs from previous runs.    
certmgr.exe -del -r CurrentUser -s My -c -n %CLIENT_NAME%
certmgr.exe -del -r CurrentUser -s TrustedPeople -c -n localhost
certmgr.exe -del -r LocalMachine -s My -c -n localhost
certmgr.exe -del -r LocalMachine -s TrustedPeople -c -n %CLIENT_NAME%
certmgr.exe -put -r LocalMachine -s My -c -n %COMPUTER_NAME% computer.cer
IF %ERRORLEVEL% EQU 0 (
   DEL computer.cer       
   pause
   certmgr.exe -del -r LocalMachine -s My -c -n %COMPUTER_NAME%
)

:cleanupcompleted   

GOTO :EOF

:setupclient
makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe

IF DEFINED EXPORT_CLIENT (        
    certmgr.exe -put -r CurrentUser -s My -c -n %CLIENT_NAME% client.cer
) ELSE (        
    certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeople
)
GOTO :EOF

:setupservice
makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe

IF DEFINED EXPORT_SERVICE (       
    certmgr.exe -put -r LocalMachine -s My -c -n %SERVER_NAME% service.cer
) ELSE (        
    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
)
GOTO :EOF

:setscriptvariables
REM Parses the input to determine if we are setting this up for a single machine, client, or server
REM sets the appropriate name variables
call :setcomputername
IF [%1]==[] CALL :singlemachine
IF [%1]==[service] CALL :service
IF [%1]==[client] CALL :client

set CLIENT_NAME=client.com

GOTO :EOF

:singlemachine    
SET SUPPORTED_MODE=1
SET SETUP_CLIENT=1
SET SETUP_SERVICE=1
SET SERVER_NAME=localhost
GOTO :EOF

:service    
SET SUPPORTED_MODE=1
SET SETUP_SERVICE=1
SET EXPORT_SERVICE=1
SET SERVER_NAME=%COMPUTER_NAME%
GOTO :EOF

:client   
SET SUPPORTED_MODE=1
SET SETUP_CLIENT=1
SET EXPORT_CLIENT=1
GOTO :EOF

:setcomputername
REM Puts the Fully Qualified Name of the Computer into a variable named COMPUTER_NAME
for /F "delims=" %%i in ('cscript /nologo GetComputerName.vbs') do set COMPUTER_NAME=%%i
GOTO :EOF

:displayusage
ECHO Correct usage:
ECHO     Single Machine - Setup.bat
ECHO     Client Machine - Setup.bat client
ECHO     Service Machine - Setup.bat service
:end

Şimdi Microsoft Yönetim Konsolu'nu açın ve Dosya Seç -> Sertifikalar - Geçerli Kullanıcı ve Sertifika - Yerel Makine depolarını eklemek için Ek Bileşen Ekle / Kaldır

Oluşturulan ve kurulan localhost (kendinden imzalı) adlı bir sunucu sertifikası bulmak için Sertifika - Yerel Makine Kişisel Deposu'na gidin.

Şimdi IIS'nizi açın ve konsol uygulamanızda tanımladığınız (54321 için) port numaranızla HTTPS bağlamasının eklenmesi ve "localhost" olması için sertifikanın seçilmesi için varsayılan web sitesine sağ tıklayın. Yukarıdaki adımlarda oluşturuldu) ve "Tamam" ve "Kapat" ı tıklayın

enter image description here

Artık hizmetinizi çalıştırabilmeniz ve şimdi kemancıyı açıp aşağıdaki gibi bir GET isteğinde bulunabilmeniz için Konsol uygulamanızı başlatın:

GET https://rajeshwin7:54321/hello/sayhello/rajesh HTTP/1.1
User-Agent: Fiddler
Host: rajeshwin7:54321

Şimdi aşağıdaki gibi bir cevap alacaksınız:

HTTP/1.1 200 OK
Content-Length: 90
Content-Type: application/xml; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 04 May 2012 14:51:25 GMT

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello, rajesh</string>

IIS bulunmadığında komut istemini açın ve winvista ve işletim sistemi üzerindeki netsh aracı ve winxp için httpcfg kullanarak ssl sertifikası için bir http port eşlemesi yapmak için komut satırına aşağıdakileri girin.

C:\> netsh http add sslcert ipport=0.0.0.0:54321 certhash=6797aea29440de9389bc636e15a35b741d8c22a3 appid={2e80948d-9ae6-42c9-ad33-294929333965}

certhash - Yukarıda oluşturulan sertifikanın parmak izi kimliği. Parmak izi kimliği, Microsoft Yönetim Konsolu'nu - yerel makinedeki bilgisayar hesabının sertifika deposunda ekle / kaldır ekini açarak ve ardından sertifikayı bulmak için kişisel depoya (yukarıda verildiği varsayılarak) varsayılarak elde edilebilir. Sertifikaya çift tıklayın ve özelliklerden biri olarak parmak izi kimliğini bulmak için ayrıntılar sekmesine gidin (boşlukları kaldırarak yukarıdaki netsh komutunda kullanmak üzere kopyalayın)

appid - proje özellikleri klasörünüzde assembly.cs dosyasında bulunan ve aşağıda gösterildiği gibi uygulamanızla ilişkili kılavuzdur:

enter image description here

Şimdi sertifikayı temizlemek için aşağıdaki komutları içeren bir bathc dosyası oluşturun ve Vs.NET komut istemini kullanarak çalıştırın:

echo off
setlocal
set CLIENT_NAME=client.com
call :setcomputername
call :cleancerts
DEL client.cer > NUL 2>&1
DEL service.cer > NUL 2>&1
GOTO end

:cleancerts
REM cleans up certs from previous runs.
certmgr.exe -del -r CurrentUser -s My -c -n %CLIENT_NAME%
certmgr.exe -del -r CurrentUser -s TrustedPeople -c -n localhost

certmgr.exe -del -r LocalMachine -s My -c -n localhost
certmgr.exe -del -r LocalMachine -s TrustedPeople -c -n %CLIENT_NAME%
certmgr.exe -put -r LocalMachine -s My -c -n %COMPUTER_NAME% computer.cer
IF %ERRORLEVEL% EQU 0 (
   DEL computer.cer
   pause
   certmgr.exe -del -r LocalMachine -s My -c -n %COMPUTER_NAME%
)

:cleanupcompleted
GOTO :EOF

:setcomputername
REM Puts the Fully Qualified Name of the Computer into a variable named COMPUTER_NAME
for /F "delims=" %%i in ('cscript /nologo GetComputerName.vbs') do set COMPUTER_NAME=%%i
GOTO :EOF

:end

Ssl sertifika eşlemesini aşağıdaki gibi netsh komutunu kullanarak bir bağlantı noktasına kaldırabilirsiniz:

c:\> netsh http delete sslcert ipport:0.0.0.0:54321

4