我正在尝试X509Certificate2从字节数组中的PKCS#12 blob 构造一个并且得到一个相当令人费解的错误.此代码在具有Windows XP管理员权限的桌面应用程序中运行.
堆栈跟踪如下,但由于_LoadCertFromBlob已标记,我因试图进行故障排除而丢失[MethodImpl(MethodImplOptions.InternalCall)].
System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
Run Code Online (Sandbox Code Playgroud)
编辑: blob是由BouncyCastle为C#生成的真正的PKCS#12,包含RSA私钥和证书(自签名或最近注册CA) - 我要做的是转换私钥和证书从BouncyCastle库到System.Security.Cryptography库,从一个导出到另一个导入.此代码适用于已经尝试过的绝大多数系统; 我从未见过该构造函数抛出的特定错误.这个盒子可能是某种环境怪异.
编辑2:错误发生在不同城市的不同环境中,我无法在本地重现它,所以我可能最终不得不将其粉碎到破损的XP安装.
既然你问过,这里是有问题的片段.该代码采用BouncyCastle表示中的私钥和证书,从个人密钥库中删除相同专有名称的任何先前证书,并通过中间PKCS#12 blob将新私钥和证书导入个人密钥库.
// open the personal keystore
var msMyStore = new X509Store(StoreName.My);
msMyStore.Open(OpenFlags.MaxAllowed);
// remove any certs previously issued for the same DN
var …Run Code Online (Sandbox Code Playgroud) 我正在使用构建脚本来编译几个C#项目.二进制输出被复制到结果文件夹,覆盖以前版本的文件,然后添加/提交到subversion.
我注意到,即使源或环境没有任何变化,编译的二进制输出也是不同的.这怎么可能?对于相同的输入,二进制结果是否应该完全相等?
我不是故意在任何地方使用任何类型的特殊时间戳,但编译器(Microsoft,.NET 4.0中包含的那个)可能会自己添加时间戳吗?
我问的原因是我将输出提交给subversion,并且由于我们的构建服务器的工作方式,已签入的更改会触发重建,导致再次修改的二进制文件以圆圈形式签入.
c# compiler-construction binaryfiles .net-4.0 binary-reproducibility
有没有人知道比较两个.NET程序集以确定它们是否是从"相同"源文件构建的方法?
我知道有一些差异实用程序可用,例如Reflector的插件,但我对查看GUI中的差异不感兴趣,我只是想要一种自动方式来比较二进制文件的集合,看看它们是否是从相同(或等效)的源文件.我知道多个不同的源文件可以产生相同的IL,并且意识到该过程只对IL的差异敏感,而不是原始源.
仅仅比较两个程序集的字节流的主要障碍是.NET包含一个名为"MVID"(模块版本标识符)的程序集.这似乎对每个编译都有不同的值,因此如果您构建相同的代码两次,则程序集将有所不同.
一个相关的问题是,是否有人知道如何强制MVID为每个编译相同?这将避免我们需要具有对MVID值的差异不敏感的比较过程.一致的MVID将是更可取的,因为这意味着可以使用标准校验和.
这背后的背景是,在我们被允许发布到Production之前,第三方公司负责独立审核和签署我们的版本.这包括查看源代码.他们希望独立确认我们提供的源代码与我们之前构建,测试并且当前计划部署的二进制文件相匹配.我们正在寻找一个允许它们从我们提供的源中独立构建系统的过程,并将校验和与我们测试的二进制文件的校验和进行比较.
BTW.请注意,我们正在使用持续集成,自动构建,源代码控制等.该问题与内部缺乏对源文件进入给定构建的控制无关.问题在于,第三方负责验证我们提供的来源是否与我们测试过并计划投入生产的二进制文件相同.他们不应该信任我们的任何内部系统或控件,包括构建服务器或源代码控制系统.他们所关心的只是获取与构建相关的源,自己执行构建,并验证输出是否与我们所说的部署相匹配.
比较解决方案的运行速度并不是特别重要.
谢谢
我今天的问题:界面中的重载方法是不是很糟糕?你知道,"省略参数,如果你不在乎,我们将找出默认值"的重载方法.像那样:
void Add(object item);
void Add(object item, bool shouldDoSomething);
void Add(object item, bool shouldDoSomething, IUltraObscureDeviceContext context);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我倾向于认为只有后者属于一个接口而其他应该在它之上的抽象类中实现.但话说回来,我不确定.
此外,有些时候你只是想要不同的重载做一些稍微不同的工作(如果重载的方法永远不应该用于此,请立即停止我).或者有时你不能只用空格代替某些参数,你想要在某些东西为空时抛出异常.在这种情况下我不应该使用重载吗?
所以基本上我正在寻找关于接口中重载方法的一些指导与实现这些接口的抽象类中的重载方法等等.提前致谢
我先给你一点背景知道我为什么问这个问题:
我目前正在一个严格监管的行业工作,因此我们的代码由官方测试机构仔细查看.这些测试机构希望能够构建代码并生成.exe或.dll,每次都完全相同(显然不会更改任何代码!).他们检查MD5和他们创建的可执行文件的SHA1以确保这一点.
到目前为止,我主要使用C++进行编码,其中(经过一些项目设置调整后)我设法让项目能够相同地重建到相同的MD5/SHA1.我现在正在一个项目中使用C#,并且在重建之后很难让MD5匹配.我知道文件的PE头中有"Time-Stamps",它们已经被清除为0.我也知道.exe有一个GUID,它再次被清除为00 00 00 ......等但是文件仍然不匹配.
我正在使用CFF资源管理器查看和编辑PE标头以删除时间和日期戳.使用二进制比较工具后,.exe中只有2个字节块不同(都非常小).
其中不一致的块的出现只是之前的一些二进制代码,这在ASCII详细介绍了路径*Project*\obj\Release\xxx.pdb文件.
编辑:现在已知这是*.pdb文件的GUID,但我仍然不知道是否可以修改它而不会导致任何错误!?
另一个块出现在看起来是函数名称的中间,即.(典型的部分)AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{
那么不同的代码块:
4A134ACE-D6A0-461B-A47C-3A4232D90816
其次是:
"} .ValueType .__ StaticArrayInitTypeSize = 7. $$ method0x60000ab-1.RuntimeFieldHandle.InitializeArray` ...等.
任何想法或建议将是最受欢迎的!
我正在寻找一些关于xsd目标命名空间的良好命名约定的想法.
基本上我只需要明确决定如何命名我的xsd的目标命名空间,所以我试着在第一次就把它弄好.稍后更改它将需要更改另一个不受我控制的系统.
您是否有过任何优秀且有效的解决方案的XML架构创建经验?我试图在线查找信息,但大多数示例只使用非常通用的目标命名空间,如"http:// exampleSchema"等.我实际上是想找到一些现实生活中的例子.
每次我们重新编译C#应用程序时,我们都会得到具有不同MD5签名的EXE.我们在相同的机器上重新编译,相隔几分钟.为什么相同的源代码不会产生相同的输出?有没有办法来解决这个问题?
我正在尝试获取SPSite远程SharePoint URL:
SPSite site = new SPSite("http://remoteserver");
Run Code Online (Sandbox Code Playgroud)
......但我得到了一个例外.当我尝试连接到本地计算机上的sharepoint时没有问题.
我有远程服务器所需的用户名和密码.有没有办法获得SPSite用户名和密码?
c# ×6
.net ×3
.net-4.0 ×1
asp-classic ×1
assemblies ×1
binaryfiles ×1
c#-3.0 ×1
checksum ×1
cryptography ×1
hash ×1
il ×1
include ×1
interface ×1
linear-types ×1
oop ×1
pkcs#12 ×1
sharepoint ×1
xml ×1
xsd ×1