存档

2010年11月 的存档

SQL收缩数据库

2010年11月20日 admin 没有评论

1.在SQL Server企业管理器中,右击要收缩的数据库,在弹出的菜单中选择”所有任务”子菜单下的”收缩数据库”项。


2.在”收缩后文件中的最大可用空间”中输入收缩后数据库中剩余的可用空间量。选择“在收缩前将页移到文件起始位置”,使释放的文件空间保留在数据库文件中,并使包含数据的页移到数据库文件的起始位置。


3.点击“调度”命令创建或更改自动收缩数据库的频率和时间。点击更改按钮对调度进行具体的设置。在弹出的窗口中选择调度发生的时机。选择“反复出现”,点击右侧的更改按钮,设定调度发生的频率和每日发生的频率以及持续时间。



4.在步骤2中,还可以选择对单个的文件进行收缩。方法是点击“文件”,在“数据库文件”列表中选择一个要收缩的文件,在“收缩操作”中选择一种收缩文件的方式点击确定按钮。




7.除了手工设置数据库的收缩外,还可以设置让数据库自动收缩。双击要收缩的数据库图标,在数据对话框的“选项”页面中选中“自动收缩”选项,点击“确定”按钮。


8.通过本例我们学习了如何收缩数据库以及如何对数据库收缩进行调度设置。HOHO

9.通过语句我们也可以来收缩数据库,AIS20071219151707是数据库名,在查询分析器中执行。

DBCC SHRINKDATABASE(AIS20071219151707)

backup log AIS20071219151707 with no_log

注:

SQL Server 2000允许收缩数据库的每个文件以除掉未使用的页面,数据文件和事务日志文件都能被收缩。收缩可以成组进行,也可以个别进行。可以指定时间间隔使得数据库在给定的时间自动收缩,这时收缩操作是在后台发生的,不会影响任何数据库用户的活动。当使用了ALTER DATABASE 的AUTO_SHRINK 选项设置数据库的自动收缩(或者是系统存储过程sp_dboption)时,每当数据库中有大量的空闲空间时,数据库就会收缩,然而如果要移除的空闲空间百分比不能被设置的话则空闲空间将会尽可能地被释放。

不能收缩比其最初的规模小的完全的数据库,所以假定一个数据库在创建时的初始大小是10M,然后增长到了100M,如果此时数据库中所有的数据都被删除了,则它能收缩到的最小规模也是10M,不过使用DBCC SHRINKFILE语句可以将单个数据库文件收缩到小于初始规模的大小,如果使用这种方法就必须对每个文件进行操作而不能对整个数据库收缩。

事务日志文件的收缩有固定的界线,虚拟日志的规模决定了可能的减少。因此日志文件决不能收缩到比虚拟日志文件更小的规模,收缩事务日志文件将删除未使用的虚拟日志文件,但会留下至少一个虚拟日志文件。

SQL Server 2000中DBCC SHRINK DATABASE或DBCC SHRINKFILE操作会试图立即将事务日志文件收缩到要求的尺寸(在取整的条件下).应该在收缩文件之前就截取好日志文件已减少逻辑日志文件的大小,并且标记出不含有任何逻辑日志的虚拟日志。

不需要删除,不就是日志文件太大,想瘦身嘛,很简单。

首先用右键选择该数据库,然后点属性,在属性页里面选择“选项”选项卡,然后你能看到,故障还原模型里面默认的是“完全”,改成“简单”,确定

然后收缩数据库(最好单个文件的收缩),这个时候你能看到,日志文件大幅度减少了,之后再次把故障还原模式修改成“完全”即可

这种方法绝对不会产生文件丢失,也没有任何安全问题,放心使用吧,呵呵!

首先应该确定是谁慢的,往往是程序处理方面的问题而不是数据库的问题。
程序方面应该尽可能的减少数据查询返回的内容,比如可以查询返回ID,然后再根据ID一条一条的查询具体内容,看似慢了,在数据量达的时候快很多

对于数据可以参照下面几点
1、优化SQL语句,SQL语句对查询速度影响最大
2、对于经常查询的字段作索引。但是这样会增加修改时的压力
4、优化SQLServer,比如给其分配固定的内存,预先分配查询内存,调整CPU使用率等。
5、优化硬件资源,比如使用更高的服务器或者硬盘,独立安排数据库的数据文件和索引文件,将数据文件分布于不同的物理硬盘上等等
6、考虑使用分布数据库或者对大表进行拆分

分类: Sql 标签:

Sql备份局域网服务器

2010年11月20日 admin 没有评论

一、定时将服务器中SQL SERVER 2000数据库备份到局域网中另一台电脑上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--实现功能:定时将服务器中SQL SERVER 2000数据库备份到局域网中另一台电脑上
--Full BackUp
--Use Master
CREATE proc bakup_DataBase
as
Declare @strPsw varchar(50)
Declare @strUsr varchar(50)
Declare @strCmdShell varchar(300)
Declare @strDataBaseName varchar(20)
Declare @FullFileName Varchar(200)
Declare @FileFlag varchar(50)
Declare @ToFileName varchar(200)
Declare @SQLStr varchar(500)
Declare @SQLStr2 varchar(500)
Declare @FlagDel varchar(20)
Set @FileFlag=replace(replace(convert(char(20),getdate(),20),':','-'),' ','-')     --备份的文件命名规则:日期-时间.bak
Set @strUsr='Administrator\Administrator' --需填写域名\用户名(目标机器的Windows登陆名)
Set @strPsw='soondy'--需填写Windows登陆密码(:Soondy)
Set @strCmdShell= 'net use \\192.168.2.178\c$ ' + @strPsw + ' /user:' +@strUsr --需填写IP(目标机器的IP地址,如:192.168.2.178)
Set @strDataBaseName='Soondy'--填写数据库名称(:Soondy)
Set @FullFileName='E:\SoondyTest\'+@FileFlag+'.BAK'--需填写本地备份临时文件的目录,因为需要先备份到本地再copy到目标机器(如:保存目录为E:\SoondyTest\)
Set @ToFileName='\\192.168.2.178\c$\Test\' --需填写IP(目标机器的IP地址)以及保存的目录(如:\\192.168.2.178\c$\Test\)
Set @FlagDel='True'--填写True表示删除本地的备份临时文件,填写False或其他字符表示保留该文件
Set @SQLStr='copy '+@FullFileName+' '+@ToFileName
Set @SQLStr2='del ' +@FullFileName
BackUp DataBase  @strDataBaseName  To Disk=  @FullFileName   with init
exec master..xp_cmdshell  @strCmdShell--尝试连接到目标机器
exec Master..xp_cmdshell @SQLStr --拷贝到目标机器上
if (@FlagDel ='True') exec master.. xp_cmdshell @SQLStr2--删除本地的备份临时文件
分类: Sql 标签: ,

多线程,抓取页面

2010年11月9日 admin 没有评论

这几天在进行网站的扫黄工作,对网站,域名进行一个个的排查。当然如果真的一个个去打开看
一下,真的是会搞死人的。有几十万的网站要去排查,那天我们几十个人搞到通宵也没搞好。不过
通过一天的劳累,也总结了不少方法。
首先是梁Boss的批处理文件,it is a real good  idea to open a batch web pages.如果单一的
去打开一个个的网页,肯定是吃不消地。只需要稍稍应用下批处理文件就可以一下打开好几十个网页
。具体操作如下:1.新建txt文件,输入内容如下
start http://www.baidu.cn
start http://www.baidu2.cn
start http://www.baidu3.cn
start http://www.baidu4.cn
….

但是 如果打开过多浏览器就会崩溃,这时就需要增加 一个
pause ,每打开多少就暂停一下。
当然这样子操作 还是要我们去肉眼判断。能不能将工作再简化一下呢,毕竟是几十万的数据啊。
我的选择是抓取网页内容,先过滤一遍关键字,因为通过网页内容文字与关键字的匹配,不能说
百分百的正确,也能达到百分七八十的正确率,再对过滤出来的网页进行人工审核,工作量减轻一
大半。
所以,就有了以下这个程序“多线程-狂抓页面”。为什么选择多线程 而不是线程池?因为多线程
我可以将线程数组设到100或1000,线程池的容量有限,还有就是我也不知道如何将线程池开到成百
上千个线程去执行,而又不冲突,主要还是对线程池不是很掌握。话不多说,贴上代码,代码是在
小谢的代码基础上的改进,在此表示感谢。
程序效果图如下:

下面进行一步步分析,如何用 多线程-狂抓页面
声明一个域名队列,
Queue<string> domainqueue = new Queue<string>();
所有要查域名都放在队列里
foreach (string domain in domains)
{
//所有域名进队列
domainqueue.Enqueue(domain);
}

声明一个线程数组:并启动
threads = new Thread[threadNum];
for (int i = 0; i < threadNum; i++)
{
threads[i] = new Thread(new ThreadStart(RunThread));
threads[i].Name = “checkDomain”+i;
threads[i].IsBackground = true;
//启动
threads[i].Start();
}

线程执行代理函数 (RunThread)
//执行线程
public void RunThread()
{
Thread current_thread = Thread.CurrentThread;//当前线程
MyInvoke mi = new MyInvoke(rtb_result.AppendText); //代理,显示线程结果
MyInvoke mi2 = new MyInvoke(rtb_illegal.AppendText);//代理,显示过滤结果
//当队列存在
while (domainqueue.Count > 0)
{
//出队列
string domain = domainqueue.Dequeue();
try
{
//同步显示
rtb_result.Invoke(mi,”域名:["+domain+"]   当前线程:["+current_thread.Name+"]” + “\r\n”);
string keyword=”";
//若扫描到,过滤结果
if (ScanDomain(domain, out keyword)) //扫描函数
{
rtb_illegal.Invoke(mi2, domain + “:” + keyword + “\r\n”);
}
//带www主机头的扫描
string host = “www.”;
if (cbx_www.Checked)
{
if (ScanDomain(host + domain, out keyword))
{
rtb_illegal.Invoke(mi2,host+ domain + “:” + keyword + “\r\n”);
}
}
}
catch (Exception ex)
{
rtb_result.Invoke(mi,ex.ToString()+”\r\n”);
}
}

}

//扫描函数
//扫描域名是否含非法信息
private bool ScanDomain(string domain,out string keyword)
{
keyword = null;
//抓取页面内容并过滤 html标记
string pageContent = PageOp.NoHTML(PageOp.GetPageContent(domain));
//抓取页面的内容,进行非法关键字匹配
return PageOp.IsIllegal(pageContent,out keyword);
}
其中抓取页面我用的webrequest对象,但是webrequest对有些网页的抓取是抓不到的,但他又比xmlhttp抓取要快,
所以我说先用webrequest 抓取,抓不到的再用xmlhttp  去抓取。
测试的效果还不错,如果网站是有网页并且可访问,1000个开100个线程也就1分钟样子就搞定,难的是有些域名是
没有解析的抓不到。也会造成网络堵塞,qq都掉了2次,抓太多也不好的啊。呵呵

分类: .NET 标签: ,

ASP.NET 下的资源文件使用

2010年11月9日 admin 没有评论

资源文件通常用在Winform中比较多,其实ASP.NET也可以使用资源文件实现多语言化。
朋友托我帮他做个小站,2钟语言版本的,我想既然是小站那也得给它加点料。刚学了
点资源文件的皮毛,那就用上了哈。示例网站如下http://www.donglongcf.cn.
下面开始如何一步步建立多语言化网站。
第一步:
新建2个资源文件,其中命名为Resource.resx,Resource_En.resx代表英文。
在界面上Aspx文件上,直接
<%= Resources.Resource.String1 %>
控件中绑定 可以这样
<asp:Label ID=”lbl_global” runat=”server” Text=”<%# Resources.Resource.Button1 %>”></asp:Label>
也可以这样
<asp:TextBox ID=”TextBox1″ runat=”server”  Text=”<%$ Resources:Resource, String1 %>” ></asp:TextBox>
就可以将对应的资源文件的值读取出来
但是,通常我们不是这样使用资源文件。只有在语言切换的时候,才显示不同的语言。比如
点击中文,显示中文语言包,英文则显示英文语言包。所以 我们要对当前语言环境进行设置
第二步:
在页面初始化的时候,设定当前语言环境,中文值为zh-CN,英文则为en-US
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(“zh-CN”);

但是,我们依然不满足,我们没必要在每个页面的page_load里都加这么一句,太繁琐。
第三步,重写页面的InitializeCulture方法
新建一个InitialCulture
protected override void InitializeCulture()
{
//当前语言变量放在了Session里 也可以放Cookie
if (Session["lang"] != null)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(Session["lang"].ToString());
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["lang"].ToString());
// base.InitializeCulture();
}
else
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(“zh-CN”);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(“zh-CN”);
}
base.InitializeCulture();
}
然后每个页面重新继承:
public partial class _Default :InitialCulture

如果你是个懒惰的程序员,那么每个页面加这么一句肯定也不会满足你。这时 就嗅到了bad smell.
第四步,
建立httpMoudle
通过在httpModle实现全局的控制
//应用程序初始化
public void Init(HttpApplication app)
{
app.AcquireRequestState += new EventHandler(context_AcquireRequestState);
//这里委托在AcquireRequestState 进行操作是 因为我把全局语言变量 放在了session里
//而session 的生成是 在AcquireRequestState 才有效
}

void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
LangGuage(app);
}

private void LangGuage(HttpApplication app)
{

if (app.Context.Session["lang"] == null)
app.Context.Session["lang"] = “zh-CN”;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(app.Context.Session["lang"].ToString());
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(app.Context.Session["lang"].ToString());
}
#endregion

这样我们的网站多语言话就初步完成了 剩下的就只是对资源文件的使用而已了

分类: .NET 标签:

Sql2000 1433端口打不开

2010年11月9日 admin 没有评论

报 The Network Adapter could not establish the connection 异常的所有遇到过的原因,并提供了图形化的排查向导。
不过根据经验,没有升级到SP4的可能性最高。可以直接看第6部分。
常见的错误为: The Network Adapter could not establish the connection
1 检查SQL SERVER 是否允许远程访问.
具体步骤:
1)打开”企业管理器”,打开控制台根目录>SQL Server 组>数据库
2)在相应”数据库”上单击右键,选择”属性”
3)选择”连接”选项卡,检查”远程服务器连接”下,RPC服务是否选择.

2 使用telnet IP地址 1433,系统是否提示连接出错 比如 telnet 127.0.0.1 1433 如果出现黑屏,
这端口正常 如系统提示出错 检查是否防火墙屏蔽了SQL SERVER 或 java IDE 的网络访问端口
如果是,关闭防火墙,重新启动SQL SERVER和java IDE,进行测试, 如果系统仍提示上述错误,尝试下列步骤

3 检查SQL SERVER 端口号及是否启用了TCP/IP协议
具体步骤: 1)打开”企业管理器”,打开控制台根目录>SQL Server 组>数据库
2)在相应”数据库”上单击右键,选择”属性”
3)选择”常规”选项卡,点击”网络配置”,如启用的协议中无”TCP/IP协议”将其加入
4)选择”TCP/IP协议”,点击”属性”,检查其端口号是否为1433
5)如端口号为1433将其修改为其它端口号,修改jdbc连接语句,将端口号同样改为新启用的端口号,
如jdbc:microsoft:sqlserver://server_name:1400(假设新端口号为 1400)
4 以下的方法你每种的去试试:
1)检查一下sql server的connection有没有full.
2)如果是认证的问题. 可到sql enterprice manager->指定server->内容->安全性. 把验证改为 SQL server 及 windows.
3)点选属性检查一下port是否正确.
4)执行%MSSQL_HOME%\80\Tools\Binn\SVRNETCN.exe 把TCP/IP启用.
5)关掉防火墙.
6)把SQL server update到sp4: http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=8E2DFC8D-C20E-4446-99A9-B7F0213F8BC5
经我验证,一般升级到sp4就好用了! 注意升级的方法,不是双击运行就可以了,
这个SP4是解压缩程序,你要指定一个目录,推荐c:\,解压缩后,
需要转到那个目录运行里面的setup.bat才是真正的安装。不知道为何微软不直接调用那个。!

分类: Sql 标签: ,

打开sql server 2000的1433端口和进行远程连接设置

2010年11月9日 admin 没有评论

SQL code远程连接sql server 2000服务器的解决方案

一 看ping 服务器IP能否ping通。
这个实际上是看和远程sql server 2000服务器的物理连接是否存在。如果不行,请检查网络,查看配置,当然得确保远程
sql server 2000
服务器的IP拼写正确。

二 在Dos或命令行下输入telnet 服务器IP 端口,看能否连通。

telnet 202.114.100.100 1433
通常端口值是1433,因为1433sql server 2000的对于Tcp/IP的默认侦听端口。如果有问题,通常这一步会出问题。通常的提示
“……无法打开连接,连接失败
如果这一步有问题,应该检查以下选项。

1 检查远程服务器是否启动了sql server 2000服务。如果没有,则启动。
2 检查服务器端有没启用Tcp/IP协议,因为远程连接(通过因特网)需要靠这个协议。检查方法是,在服务器上打开 开始菜单->
程序-> Microsoft SQL Server-> 服务器网络实用工具,看启用的协议里是否有tcp/ip协议,如果没有,则启用它。
3 检查服务器的tcp/ip端口是否配置为1433端口。仍然在服务器网络实用工具里查看启用协议里面的tcp/ip的属性,确保默认
端口为1433,并且隐藏服务器复选框没有勾上。
事实上,如果默认端口被修改,也是可以的,但是在客户端做telnet测试时,写服务器端口号时必须与服务器配置的端口号
保持一致。如果隐藏服务器复选框被勾选,则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不
影响连接,但是Tcp/ip协议的默认端口将被隐式修改为2433,在客户端连接时必须作相应的改变。
4 如果服务器端操作系统打过sp2补丁,则要对windows防火墙作一定的配置,要对它开放1433端口,通常在测试时可以直接关掉
windows
防火墙(其他的防火墙也关掉最好)
5 检查服务器是否在1433端口侦听。如果服务器没有在tcp连接的1433端口侦听,则是连接不上的。检查方法是在服务器的dos或命令行下面输入
netstat -a -n 或者是netstat -an,在结果列表里看是否有类似 tcp 127.0.0.1 1433 listening 的项。如果没有,则通常需要给
sql server 2000
打上至少sp3的补丁。其实在服务器端启动查询分析器,输入 select @@version 执行后可以看到版本号,版本号
8.0.2039以下的都需要打补丁。
如果以上都没问题,这时你再做telnet 服务器ip 1433 测试,将会看到屏幕一闪之后光标在左上角不停闪动。恭喜你,
你马上可以开始在企业管理器或查询分析器连接了。

三 检查客户端设置

程序-> Microsoft SQL Server -> 客户端网络使用工具。像在服务器网络实用工具里一样,确保客户端tcp/ip协议启用,并且
默认端口为1433(或其他端口,与服务器端保持一致就行)

四 在企业管理器里或查询那分析器连接测试

企业管理器-> 右键SQlserver-> 新建sqlserver注册-> 下一步-> 写入远程IP-> 下一步-> Sqlserver登陆-> 下一步-> 写入
登陆名与密码(sa,password)-> 下一步-> 下一步-> 完成
查询分析器-> 文件-> 连接-> 写入远程IP-> 写入登录名和密码(sa,password)-> 确定
通常建议在查询分析器里做,因为默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是4秒,而查询分析器是
15
秒。

修改默认连接超时的方法:
企业管理器-> 工具-> 选项-> 在弹出的“SQL Server企业管理器属性窗口中,点击高级选项卡-> 连接设置-> 在 登录超时
(
) 后面的框里输入一个较大的数字
查询分析器-> 工具-> 选项-> 连接-> 在 登录超时() 后面的框里输入一个较大的数字
通常就可以连通了,如果提示错误,则进入下一步。

五 错误产生的原因通常是由于SQL Server使用了 Windows”的身份验证方式,因此用户无法使用SQL Server的登录帐户
(
sa )进行连接。解决方法如下所示:

1 在服务器端使用企业管理器,并且选择使用 Windows 身份验证连接上 SQL Server
2 展开“SQL Server,鼠标右键点击SQL Server服务器的名称,选择属性,再选择安全性选项卡。
3 身份验证下,选择“SQL Server Windows “
4 重新启动SQL Server服务。(dos或命令行下面net stop mssqlserver停止服务,net start mssqlserver启动服务,也是一种快捷的方法)

分类: Sql 标签: ,

svn钩子脚步文件清除工具

2010年11月9日 admin 没有评论

svn会有很多的钩子脚本,要清除所有的文件导入一个注册表就可以。

以下是下载地址:点此下载

分类: Index 标签:

不同格式证书导入keystore方法

2010年11月6日 admin 没有评论

各种数字证书区别
cer后缀的证书文件有两种编码–>DER二进制编码或者BASE64编码(也就是.pem)

p7b一般是证书链,里面包括1到多个证书
pfx是指以pkcs#12格式存储的证书和相应私钥。

在Security编程中,有几种典型的密码交换信息文件格式:
DER-encoded certificate: .cer, .crt
PEM-encoded message: .pem
PKCS#12 Personal Information Exchange: .pfx, .p12
PKCS#10 Certification Request: .p10
PKCS#7 cert request response: .p7r
PKCS#7 binary message: .p7b

.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
.pem跟crt/cer的区别是它以Ascii来表示。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式
p10是证书请求
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

其中,我介绍如何从p12/pfx文件中提取密钥对及其长度:
1,首先,读取pfx/p12文件(需要提供保护密码)
2,通过别名(Alias,注意,所有证书中的信息项都是通过Alias来提取的)提取你想要分析的证书链
3,再将其转换为一个以X509证书结构体
4,提取里面的项,如果那你的证书项放在第一位(单一证书),直接读取 x509Certs[0](见下面的代码)这个X509Certificate对象
5,X509Certificate对象有很多方法,tain198127网友希望读取RSA密钥(公私钥)及其长度(见http://www.matrix.org.cn/thread.shtml?topicId=43786&forumId=55&#reply),那真是太Easy了,
X509Certificate keyPairCert = x509Certs[0];
int iKeySize = X509CertUtil.getCertificateKeyLength(keyPairCert);
System.out.println(“证书密钥算法=”+keyPairCert.getPublicKey().getAlgorithm());
System.out.println(“证书密钥长度=”+iKeySize);
提取了他所需要的信息。

X.509定义了两种证书:公钥证书和属性证书
PKCS#7和PKCS#12使用的都是公钥证书
PKCS#7的SignedData的一种退化形式可以分发公钥证书和CRL
一个SignedData可以包含多张公钥证书
PKCS#12可以包含公钥证书及其私钥,也可包含整个证书链

简介
Java自带的keytool工具是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。

keytool 将密钥和证书储存在一个所谓的密钥仓库(keystore)中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥。

Java KeyStore的类型
JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型(我所知道的共有5种,JKS, JCEKS, PKCS12, BKS,UBER)。

JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。

JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDes)。

PKCS#12是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。

BKS 来自BouncyCastle Provider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个 bit都会产生错误),BKS能够跟JKS互操作,读者可以用Keytool去TryTry。

UBER比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此keystore能够防止被误改、察看以及校验。以前,Sun JDK(提供者为SUN)允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不允许这种情况。
Java自带的keytool工具是个密钥和证书管理工具。

它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。

keytool 将密钥和证书储存在一个所谓的密钥仓库(keystore)中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥。

Java KeyStore的类型

JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型(我所知道的共有5种,JKS, JCEKS, PKCS12, BKS,UBER)。

JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。

JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDes)。

PKCS#12是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。

BKS 来自BouncyCastle Provider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个 bit都会产生错误),BKS能够跟JKS互操作,读者可以用Keytool去TryTry。

UBER比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此keystore能够防止被误改、察看以及校验。以前,Sun JDK(提供者为SUN)允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不允许这种情况。

证书导入

Der/Cer证书导入:

要从某个文件中导入某个证书,使用keytool工具的-import命令:

keytool -import -file mycert.der -keystore mykeystore.jks

如果在 -keystore 选项中指定了一个并不存在的密钥仓库,则该密钥仓库将被创建。

如果不指定 -keystore 选项,则缺省密钥仓库将是宿主目录中名为 .keystore 的文件。如果该文件并不存在,则它将被创建。

创建密钥仓库时会要求输入访问口令,以后需要使用此口令来访问。可使用-list命令来查看密钥仓库里的内容:

keytool -list -rfc -keystore mykeystore.jks
查看证书详细信息
keytool -list -v -keystore keystore.jks

P12格式证书导入:

keytool无法直接导入PKCS12文件。

第一种方法

是使用IE将pfx证书导入,再导出为cert格式文件。使用上面介绍的方法将其导入到密钥仓库中。这样的话仓库里面只包含了证书信息,没有私钥内容。

第二种方法

是将pfx文件导入到IE浏览器中,再导出为pfx文件。
新生成的pfx不能被导入到keystore中,报错:keytool错误: java.lang.Exception: 所输入的不是一个 X.509 认证。新生成的pfx文件可以被当作keystore使用。但会报个错误as unknown attr1.3.6.1.4.1.311.17.1,查了下资料,说IE导出的就会这样,使用Netscape就不会有这个错误.

第三种方法

是将pfx文件当作一个keystore使用。但是通过微软的证书管理控制台生成的pfx文件不能直接使用。keytool不认此格式,报keytool错误: java.io.IOException: failed to decrypt safe contents entry。需要通过OpenSSL转换一下:

1)openssl pkcs12 -in mycerts.pfx -out mycerts.pem

2)openssl pkcs12 -export -in mycerts.pem -out mykeystore.p12

通过keytool的-list命令可检查下密钥仓库中的内容:

keytool -rfc -list -keystore mykeystore.p12 -storetype pkcs12

这里需要指明仓库类型为pkcs12,因为缺省的类型为jks。这样此密钥仓库就即包含证书信息也包含私钥信息。

P7B格式证书导入:

keytool无法直接导入p7b文件。

需要将证书链RootServer.p7b(包含根证书)导出为根rootca.cer和子rootcaserver.cer 。

将这两个证书导入到可信任的密钥仓库中。

keytool -import -alias rootca -trustcacerts -file rootca.cer -keystore testkeytrust.jks

遇到是否信任该证书提示时,输入y

keytool -import -alias rootcaserver -trustcacerts -file rootcaserver.cer -keystore testkeytrust.jks

总结:

1)P12格式的证书是不能使用keytool工具导入到keystore中的

2)The Sun’s PKCS12 Keystore对从IE和其他的windows程序生成的pfx格式的证书支持不太好.

3)P7B证书链不能直接导入到keystore,需要将里面的证书导出成cer格式,再分别导入到keystore。

分类: Java 标签: ,

jar文件不能运行 没有打印错误信息

2010年11月6日 admin 没有评论

一般这种情况下 要用cmd命令 到目录下

E:\java\project\info java -jar info.jar

才能看见详细信息

分类: Java 标签:

jar文件Could not find the main class解决办法

2010年11月6日 admin 没有评论

可能原因。
1.myeclipse中 没有指定main函数直接export.
解决办法:
1.把lib目录里的jar文件一一解压,把解压后的类文件连同目录添加到Mycipher.JAR文件中,很easy的搞定。
2.修改MANIFEST.MF文件的Class-Path属性的值(目录路径用/或者.代替,jar之间用空格分开)如:Class-Path: ../lib/miglayout-3.5.5.jar ../lib/TableLayout.jar ../lib/swing-layout-1.0.jar,同时把用到的jar文件放到指定的路径下。