|
|
2001-12-20 microsoft
8 i, X; u! ]& b5 q! H2 p; `1 U1 z" ^
+ f9 r. X p+ b, R, p! K 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
( z# ]6 w6 I: Y+ Z1 i* @) N% }$ @- Q+ m* }5 c0 S6 Y
创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
' `4 z. F" j( Z4 E: u8 R$ a/ U: A) E2 ?- X. v5 |
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
* s1 p! }( z* w
) F7 `- X& O" v/ q0 }$ Z& [ 下面是创建签署CAB文件的步骤 : ' M4 ?" |5 `' K! R
P3 V1 E& p8 r
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
* c& T- T6 B; J a4 m+ [" k [
) U# k- {. e8 V& s6 O 2 创建 CAB 文件
1 a4 V P; \2 \ I
0 g& [7 \8 ~, U7 F2 `4 ^: S" Z 3 签署您的文件 + m/ g K9 e( A) s$ G
$ s! K5 S9 }, k, m
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
9 @- a: L2 ]6 x: c0 _# e/ ~, Z1 j( w# b: u* a5 g
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 . d- T* Q2 l# I* K! R
2 `- p( b2 p2 [8 A; Z 有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. & J) s7 k" a+ ?! H7 G9 O% S
( o( z, W: d0 `: O( d4 w$ ]& Z y
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 # \& K8 O+ w5 v; s. z
: r- J1 ]+ g$ Z6 Z 获得一个软件出版商证明书+ U. }+ C* {( R% @: b* [( c, V* |
; } h5 b2 ~! P2 d6 R 您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 / m- T2 C( D5 X; L3 q7 r
& K: _, ^$ E9 d) Y7 p 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
1 y9 y9 p* \0 y5 Y0 Z" D" z
) Q) ?8 {$ Y+ `' b7 }C:\CAB&SIGN\MAKECERT
7 m K; e# i: G; H s3 K N-u: MyKey 8 G( ~9 k; q$ l& Y: K
-n: CN = MySoftwareCompany 2 I# F, |9 C8 n- ]& |7 [: K* T0 N. ?
-k: MYKEY.PVK CERT.CER
( _/ C; R i7 }+ w2 x$ R+ Y9 A/ V
* T! \% v% Y5 k$ i4 l- s- ~ MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
2 K+ x9 e# B! D
% _3 B% p% O* T3 Y ?2 O, Q 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
, d, u: S) V# [! j" [) p
/ Z( j% m O3 i, MC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
3 Q" r% k9 O9 K, t
" n6 e" e6 v$ `/ F* J$ ?7 A 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 5 g L8 j" |1 U* B' G- z" ^
7 a0 N$ z5 A/ b. L 创建一个 CAB文件
, Y1 V3 j) T9 l5 K! a9 H6 P( Y7 C6 z7 J3 {1 l
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
: s$ w7 t: [! _0 G% G5 t1 R1 o; q- h6 i' \
创建一个 CAB文件: ' ~( X U+ y z7 I2 r" h1 G
' L3 H: A* U3 f Z 创建一个INF文件。
i5 d( C$ k" w, `/ i! n, N/ B0 K% ~6 s5 P3 O5 n" H6 l! Y
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 8 y+ b7 e5 m, I6 {
( \3 C( P) A* [0 KC:\CAB&SIGN\CABARC -s 6144
, L2 {& K. V2 M* K; K: {% O, M8 Qn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
4 k$ i7 X9 ?% e& t5 L% `& h @; M6 A* { y5 w
CABARC 创建了一个名为MYCTL.CAB的CAB文件。 + d7 ?/ W: ^! M: d( ~- U
& ^( h+ U) n/ ~3 h" j
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
, Z0 l ?' q( D/ S5 \" p4 h6 Y; c; Q8 t, L7 H2 z- W1 `, n& C
-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
. ]/ K- g) c' d- e0 x% _7 _3 ]+ F* K$ k" i3 i0 h+ f
C:\CAB&SIGN\CABARC
7 K( u& d; x+ o4 l& s" h
- E) d# p! i* @) g 创建一个INF文件! J! r: d) g' n0 G3 H
: V* g0 R- U* R/ d& l2 X INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,请参考万维网站Packaging Component Code for Automatic Download,或者参考平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\INF Files目录下的内容。
& O: x" o! {! T/ m# N; f+ ~
- Q5 x& E, f0 d8 m4 W" A. C 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
- t: w1 y, m% g; y5 q; f5 {- q4 b% z: S' v' ]9 e0 u4 u4 {0 Z
; Sample INF file for POLYGON.DLL
) m- B& k5 f2 b$ k7 @- ?[version]
. p7 t& R* \' W# A; H7 ]# W; z! h; version signature (same for both NT and Win95) do not remove
: P- L5 K! s2 S" P3 S) ]signature="$CHICAGO$"
% X7 m. A6 b. n0 Y/ ]: BAdvancedINF=2.0
9 N" s& ^: \# K8 ~/ p8 S* k1 s
' }0 R! s5 u* l0 W9 V[Add.Code]% [) _) J+ ~5 F# Z) z8 l. H5 z: n% v
polygon.dll=polygon.dll
# ^3 b: d, g4 D0 g3 h! Uatl.dll=atl.dll1 y5 Q3 @7 z5 f5 d" B5 o* @
5 x2 ?' o3 R8 z6 V: A/ r; needed DLL- L: k' g8 p+ H& o- h# |
[atl.dll]9 {; \: y: h1 {! y7 V( w
file-win32-x86=thiscab
3 U( v7 d8 i" L3 Q( CFileVersion=2,00,0,7024
% l) k' @( Y( P; xDestDir=11
. k; W8 `4 @6 j' v3 j: n( s. K' Q/ LRegisterServer=yes 3 D# K7 q! _2 U* M
6 C4 W. j0 w# U( t& {1 ^+ A J/ N! N
[polygon.dll]
/ A7 v) m% X. ~, Vfile-win32-x86=thiscab/ b0 i. r0 M+ b. `1 O0 s
clsid={4CBBC676-507F-11D0-B98B-000000000000}
2 i& Y% y9 r* l+ y k7 N3 UFileVersion=1,0,0,1 5 X( g3 b+ p$ o7 P6 g* f2 V& [7 |
RegisterServer=yes
: \1 q- e+ D: ]) F: P; end of INF file B. g- N7 B" p/ [
+ v. o% o0 L0 k6 h3 i 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
2 T" J2 X i+ J# o6 k2 p2 N5 _
8 o: e$ p- G& O( i. I/ w! { file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
& w6 x! y9 K6 L# k F) r: l' F+ T' s5 q5 k7 Z6 s
关键字"file-win32-x86" 指定平台是 x86。 + N M- Y3 f4 P- R+ j9 r, b; [
+ {" P' D! H) d7 v$ I 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 % g% a1 w$ n. @0 D
: O& u1 ?7 Z0 `, |+ T "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
& @* m- y% O. }) D& i) E
, a" K: v& b7 l "clsid" 指的是要安装控件的CLSID。 $ v9 Z9 B, J7 U' d/ b/ o
6 ~7 y, ]* d: s6 q2 f
创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
2 P; M* c- Z* r; |* U: T
' M5 K! q) p% ^* O9 D" s C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
h$ y' y/ y! R' F @
1 @) z5 ~* ^+ Z 该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
) g( X1 @$ n: E6 K9 Z0 |- V
9 Y% I! u& y7 ~( z) k 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
7 _6 Z" X8 P) Y' R! u' G, J V: ]7 Y8 [) ^+ V
签署一个CAB文件
+ F) M$ f+ c! r% F9 O( d0 ~) a% N+ ]' N3 @( p7 ]8 g/ H. J
使用Code Signing Wizard签署一个CAB文件: ( s% w: }0 [8 M. q8 T
" o7 ]; `2 F, }' S( f+ a 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 8 i6 Q5 Z8 f# x
5 G$ \% k, d. k& N2 ^: b5 S6 i* {
C:\CAB&SIGN\SIGNCODE
. p6 N# A( d6 T. ] S& P9 {3 R1 i* [- f8 a6 B% |
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
; n- o. t5 h# Q7 P$ |9 a
; S5 q/ J* B' z; N: ?3 ~' m: ] 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
0 }4 j4 x I+ N4 `: y8 ^) Z3 b1 `! x* Q: w7 d" U
4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 + V+ M' [ s0 f4 _$ M' B6 U3 g
6 F! D! ?; ` a7 F
9 g6 F2 [; V* B" O# k( Y6 E
5. 点击Next,前进到下一页。 8 D* w# q8 g" h" z6 ~
W" ~/ C% d3 y; ~ U6 y6 z 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
2 x! S$ d( \7 ~2 w' f9 O6 r; t* U; [
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 9 s( ~' O% C0 o; f* U
2 y9 O6 p" D) y/ u( T6 V8 q# }) t
8. 连续两次点击 Next前进到最后一页。 1 m/ W4 N, B8 @! C
* F7 e7 C" A0 |, H* d# P 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
4 e/ z' T, J' w- t2 G( p, D) w+ X7 f- u! R7 Y
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
. c3 h) u N! g/ n6 e* ?9 D8 X _2 h {; m5 h. p
将签署过的 CAB文件嵌入一个Web页
, C' m) I" u& Q# `" Y
6 G1 ] X9 }6 K: {) \9 N" k. q ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : - A* B+ V- L& O, A S
2 b4 `! i. ]& D: D) y8 V7 H8 q! k
ID - 控件名称
1 M3 H) U! I3 [2 S. D8 y: b: o( G9 Z( z: z
CLASSID - 控件的CLSID
]% B) ]8 N) \
5 H$ c; B8 o+ r( T+ F4 { CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 7 y/ T" _1 G( I. Z
3 w7 D$ g/ E0 W6 P+ L CODEBASE可以直接指向一个OCX 文件或者DLL文件: + q0 d) e! E0 `) J1 q. U
* S6 G, `5 s8 c9 j
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" / t/ N+ }# r/ `0 s
& x9 ^$ R8 }% h$ H 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 4 Y/ p7 Q7 p1 B
3 c5 Q5 F2 H9 D 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
" d1 D4 X) w: t( b3 M8 r1 ^
$ A! u E$ s1 E+ t$ sCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" + k' r. F! Q; B1 x
; Z" H z R" ]3 Z/ \+ `
如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|