.NET derlemesini imzalamamanın yanlış bir yanı var mı?


95

Meslektaşlarımdan biri toplantıları imzalamaya çok meraklı. Kelimenin tam anlamıyla herhangi bir şeyi imzalamaya çalışıyor. Microsoft'tan imzalanmamış derlemeleri kullandığımızda bile, kaynak kodunu alacak, imzalayacak ve ardından diğer geliştiricilerden kendi kopyasını kullanmalarını isteyecek.

Bir montajı imzalamanın arkasındaki temel fikri anlayabiliyorum: belirli bir montajın tehlikeli bir bilgisayar korsanı tarafından tehlikeye atılmamasını sağlamak. Bu nedenle, eğer bir yazılım geliştirme şirketiysek, müşterilerimize bazı .NET kitaplığı yayınlamadan önce montajımızı imzalamalıyız.

Ancak, burada öncelikle kendi kullanımımız için web uygulamaları geliştiriyoruz ve kullandığımız her bir montajı imzalamanın amacını göremiyorum.

Burada bir şey mi kaçırıyorum?


1
Burada bazı karışıklıklara dikkat çekmek önemlidir: "dijital imzalar" (güvenlik amacı olan) ve "Dll ​​cehennemine karşı bir çözüm olan ve GAC'nin kitaplıklara bağlanmasına yardımcı olan" Kesinlikle adlandırılmış derlemeler ". Birini veya diğerini kullanmak benzerdir ve her ikisi de bir meclisin imzalanması açısından söz edilebilir. Görünüşe göre bazı posterler birini düşünüyor ve diğerleri diğerini veya her ikisini birden düşünüyor.
amalgamı

Yanıtlar:


50

Güvenilir bir ortamda kullanılan meclisleri imzalamak bana aşırı geliyor.

İmzalı derlemelerde ilginç bir nokta, kriptografik olarak doğrulanmaları gerektiğinden, bunların imzasız derlemelere göre biraz daha yavaş yüklenmeleridir.

Bir montajı imzalamak için, bağlı olduğu tüm montajların da imzalanması gerekir. Tahminimce bu, meslektaşınızın her şeyi imzalama arzusuna katkıda bulunuyor - derleyici bunu talep ediyor.


DÜZENLE Bu cevabı yazdığınızdan beri hem yanlıların hem de karşı tarafın kabaca eşdeğer desteğe sahip olduğunu görebilirsiniz. Açıkça burada doğru bir cevap yok.

Bu düzenlemeyi zorlayan nokta, günümüzde NuGet'ten çok sayıda açık kaynak kitaplığı almamız ve bunların çoğunun hiç imzalanmamış olmasıdır. Derlemenizi imzalamak isterseniz, herhangi bir bağımlılığı da imzalatmanız gerekir. İmzalanan açık kaynak kitaplıklarının çoğu, kaynak havuzlarında herkesin erişimine açık olarak imzalamak için kullanılan özel anahtarlara sahiptir.

Her şeyde olduğu gibi, yapılacak değiş tokuşlar var. Özel ortamlarda çalışma deneyimime göre, devlet kurumlarının kodunuzu değiştirmesinden endişelenmediğiniz sürece , imzalamanın faydaları çoğunlukla teoriktir (veya @ user289100'ün bahsettiği gibi akademiktir ), bu durumda bu kadar çok düzeyde paranoyak olmanız gerekir. altyapınız imzalamanın küçük bir çaba gibi görünmesini sağlar. Aksi takdirde, her şeyi imzalamak zorunda kalmaktan kaynaklanan zorlukların miktarı buna değmez. Ancak çevrenizin farklı gereksinimleri olabilir veya bir mazoşist olabilirsiniz!

Güçlü adlar kullanırken sürüm oluşturma derlemelerine ilişkin zorluklar hakkında bilgi için Teun D'nin yanıtına da bakın .


17
Kabul edildi, artık ona bağımlılık gibi
Janie

3
Unutulmaması gereken bir nokta daha, bu derlemeyi farklı uygulamalarda paylaşmak istiyorsanız, imzalama bir zorunluluktur (yani GAC).
rajesh pillai

60

İnsanlara neden önemli olduğunu göstermeden önce ve akademik ortamlarda sorunları çözmek için imzasız meclislerden faydalandım. İmzasız (yine akademik bir ortamda) bir DLL dosyasını aynı isimde, aynı imzalarla yaptığım bir DLL dosyasıyla değiştirdim ve .NET Reflector kullandım ve orijinal kodu kopyalayıp yapıştırmak için , ancak benimkinde kullanıcı adları ve şifreleri e-postayla gönderdim. 'gerçek' kodu çağırmadan önce aktarılıyordu.

İmzalanmışsa, bir imza eşleşmesi yapabilir ancak değiştiremezsiniz. Zippy'nin söylediğinin aksine, bir çalışma zamanı uyum hatası olacaktır.

İmza meclisleri asla aşırı değildir. 30 saniye sürer. Bu, ülkede yaşıyorsanız, kapılarınızı kilitlemenin abartılı olduğunu söylemek gibi bir şey. Eşyalarınızla kumar oynamak istiyorsanız, devam edin, açık bırakın. Kovulmak için sadece bir güvenlik ihlali yeterlidir. Bir montajı imzalamak yalnızca 30 saniye sürer ve imzalanmaması gereken bir iş vakası yoktur. Performans etkileri ihmal edilebilir düzeydedir.


11
Bir bilgisayar korsanı dll'yi değiştirebilirse, dll'yi çağıran uygulamayı da değiştirebilir.
ZippyV

12
Bu doğru Zippy'dir, ancak uygulamayı imzalamak için anahtara sahip olmadan, uygulamayı, orijinal uygulamanın yalnızca imzalı sürümünün çalışmasına izin verilen bir ortamda çalıştırmakta zorlanırlar, bu da birkaç durumda olabilir. Çalıştığım ortamlar. Ağaçlar için ormanı özlemeniz: Bir meclisi imzalamamak, kaçınılması 30 saniye süren gereksiz bir güvenlik riskini alıyor ve şimdiye kadar görmediğim bir iş vakası veya gerçek dünya vakası yok bir meclis imzalayın.
user289100

39

Ek bir nokta: montajlarınızı imzalamak, sürümler üzerindeki geriye dönük uyumluluğu bozar. Referanslarınızın tümü sürüm numaralarını içermeye başlar ve diğer sürüm numaralarına sahip sürümler uyumlu değildir. Bu, dağıtılmış derlemelerin daha yeni sürümlerine yükseltmeyi engeller.

Kanımca, yalnızca somut bir kazanç görürseniz kod işareti düzeneklerine ihtiyacınız var:

  • güvenilmeyen kişilerin meclislerinize dokunabileceği ortamlara konuşlandırırsanız
  • güveni yükseltmek için sertifikayı kanıt olarak kullanmak istediğiniz belirli eklenti modellerinde
  • Kodunuz diğer imzalı kodlardan çağrılabilir olması gerekiyorsa (örneğin, log4net gibi bir proje, kodlarının geniş çapta kullanılabilir olduğunu haklı olarak işaretler; birkaç yıl önce gizli anahtarlarını kaybederek büyük ölçüde uyumluluğa karıştılar, başka bir kod imzalama riski) .
  • GAC'ye dağıtmak istiyorsanız

9

Meslektaşınız toplantıları neden imzalamayı sevdiği konusunda size herhangi bir ipucu verdi mi? Henüz burada tartışılmayan imzalamanın bir avantajı, GAC'ye yalnızca imzalı montajların konulabilmesidir (yani yönetilen süreçler arasında paylaşılabilir), ancak (kuşkusuz deneyimsiz) bakış açımdan olumsuz yönler, olumlu yönlere ağır basıyor gibi görünüyor.

Kendini imzalayan Microsoft koduyla ilgili anekdotunuz benim için özellikle şüpheli görünüyor. MS kodu imzalamadıysa, muhtemelen bir nedeni vardır, değil mi? Ve imzalayarak, yazmadığınızda sorumluluk alıyorsunuz - geleceğin sizi ısırması için başka bir fırsat.


2
aslında neden olduğundan emin değilim ama Microsoft kesinlikle Enterprise Library 3.1'i imzalamadı
oscarkuo

1
Bir derlemenin süreçler arasında paylaşılması neden derlemenin GAC'de olmasını gerektiriyor?
Dirk Vollmar

4
Bu, aynı .dll'ye çalışma zamanı referanslarını paylaşamayacağınızdan değil, yalnızca güçlü adlara sahip (yani imzalı olanlar) derlemelerin GAC'ye girebilmesi ve derlemelerin paylaşılabilmeleri için GAC'ye yerleştirilmesidir.
Dan Davies Brackett

4

Bir meclisi imzalamakla ilgili başka bir şey de, sizin yerinize yanlış olanı enjekte edememenizdir (ayrıca - kendinize kaza ile). Örneğin, bir Foo.dll, sürüm 1.0 derlemesine başvuran bir program oluşturursanız, bir kişi aynı sürümle bir derleme oluşturabilir ve sizinkini değiştirebilir, kitaplığınızı imzaladığınızda bu mümkün olmayacaktır ( en azından bunun kolayca mümkün olduğunu düşünmüyorum).


4

İmzalar yalnızca derlemeler GAC'ye yerleştirilirse gereklidir, başka bir şey yoktur. İmzalı meclisler, birinin onlarla uğraşmasını engellemez. Bir bilgisayar korsanı, imzayı ve imzayı kontrol eden diğer herhangi bir kodu yine de çıkarabilir.


2
Bir web uygulaması için, bilgisayar korsanının web.config dosyasını da değiştirmesi gerekir.
Tangurena

3
Bir bilgisayar korsanı bir derlemeden imzaları kaldırabilirse, web.config onları da durdurmayacaktır.
ZippyV

4
Olumsuz oy verenlerin ianpicknell.blogspot.com/2010/02/… ve bundan bağlantılı benzer makaleleri okumaları önerilir .
Constantin

1
Akım: evet ve hayır. Denedim ve Windows varsayılanı imzayı ("güçlü ad") KONTROL ETMEMEKTİR. Muhtemelen Kullanıcı Dostu Olacaktır :-) Referans verilen bağlantılar, imza kontrolünü zorunlu kılmak için App.config'e ne ekleneceğini gösterir. Ve sonra, makalenin aksine, imza denetimi gerçekten çalışır ve ister sürüm nr ister içerikle olsun, herhangi bir tahrifatı tespit eder.
Roland

3

Biraz israf gibi göründüğüne katılıyorum. Dosyanın düşündüğünüz gibi olduğundan (ve değiştirilmediğinden) emin olmak gerçekten gerekiyor. Ancak kendi ağ güvenliğinizin ve web sunucunuzun sınırlarına güveniyorsanız, web derlemelerinizi imzalamak gereksiz bir adım gibi görünür.

Ama belki de bu benim küçük işletme deneyimimdir. Kritik bir çevrimiçi bankacılık web sitesinden bahsediyorsanız, o zaman oturum açın.


2

Bir şeyi gönderecekseniz ve / veya gerçekten yapmak için bir sebebiniz varsa, bunu yapmayı düşünün. Diğer her durumda, bu sadece güçlüktür. İş arkadaşınıza bunu yapmaktan gerçekte ne elde ettiğini sorarım.

Daha önce imzalı montaj-itis ile karşılaştım ve posteriorda bir acı, özellikle de meclisleri imzalama konusunda çok az bilgisi olan veya hiç bilgisi olmayan insan sayısını düşündüğünüzde, bunun ne için ve nasıl yapılacağı. Bu, kesinlikle gerekli olmadıkça endişelenmene gerek olmayan başka bir şey.



1

Derlemelerimizi imzalarız çünkü aşağıdaki gibi hatalar aldığımız zamanlar vardır (bu testten kaynaklanmaktadır, ancak uygulamayı çalıştırırken ortaya çıkabilir):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Visual Studio'nun bazen yanlış anladığını ve eski kodu çalıştırdığını gördük .

Eski kodu çalıştırıyorsanız bir hata istiyorsanız, montajlarınızı imzalayın.

Bir nuget paketi yazıyorsanız , lütfen derlemelerinizi imzalayın . İmzasız derlemeler, kodumuzun en son sürümünü çalıştırdığımızdan emin olmak isteyenler için tuhaftır. Visual Studio'yu düzeltemiyorum . Tek yapabildiğim, Visual Studio'nun yanlış anladığını tespit etmek. Bu yüzden lütfen nuget montajlarınızı imzalayın .


Güncelleme: İmzasız derlemeleri kullanmanın gelgiti kazanıyor;) Yukarıdaki sorunu farklı bir şekilde çözüyoruz: boş veya "temiz" bir ed dizininden başlayarak bir CI sunucusunda oluşturun ve test edin. Belki geliştirme makinelerimizde yerel olarak senaryo var, ancak bunun olması veya çok fazla pratik etkisi olmaması nadirdir.
Clay Lenhart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.